2014-09-12 62 views
0

我一直在編程Objective-C只有幾個星期。從1987年開始,我在編程語言(如基本,Visual Basic,C++和PHP)方面的經驗更加廣泛,並且一直延續到今天。儘管在過去的5年中,我專門編寫了PHP代碼。整數精度和轉換錯誤

今天,我發現自己被Objective-C語言中認爲是位轉換錯誤的困惑所困擾。我第一次注意到這一點時,試圖分裂一個整數(84)由浮動(10.0)轉換爲浮動。這產生了8.399999,而不是我希望的8.400。我爲這個問題編寫了一個方法並繼續前進。

今天,我從NSMutableDictionary中提取(int)0。我首先將它存儲在一個NSInteger中,然後將其存儲在一個int變量中。對於這兩種情況,這些值都應爲0,但對於這兩種情況,我都會得到整數值151229568.(請參見截圖)

我記得從我的早期編程年代起,我們不得不擔心容器的大小,因爲指向用32位指針訪問一個4位值的存儲器會導致捕獲所有與其他值相關的數據,從而導致被捕獲的數字出現錯誤。隨着隱式內存管理和類型轉換成爲常態,多年來我不必擔心這種問題,現在我再次遇到這種問題,我需要對熟悉該主題的程序員給出建議和澄清在今天的編程環境中。

問題:

  1. 這是不正確的指針大小或者其他什麼東西的情況?
  2. 在後端發生了什麼以產生從0到另一個數字的轉換?
  3. 我能做些什麼來從我的Objective-C計算和變量賦值中獲得更好的精度和準確性?

代碼:

NSInteger hsibs = [keyData objectForKey:@"half_sibs"]; 
int hsibsi = [keyData objectForKey:@"half_sibs"]; 
//breakpoint and screen capture of variables in stack 

screenshot of memory values showing dictionary and test variables

+0

您不能直接在字典中存儲'NSInteger'或'int'。你需要把它們包裝在一個'NSNumber'中。 – rmaddy 2014-09-12 16:41:32

回答

1

我不知道目標C那麼好,但它看起來像你用它來獲取你的數據返回的id數據類型的方法(請參閱this reference),而不是int

看起來您需要投射它或以這種方式獲取整數值:

NSInteger hsibs = [[keyData objectForKey:@"half_sibs"] integerValue]; 
int hsibsi = [[keyData objectForKey:@"half_sibs"] intValue]; 

然後看看你是否得到預期的結果。

+0

僅供參考 - 第二行應該調用「intValue」,而不是「integerValue」。 – rmaddy 2014-09-12 16:49:05

+0

謝謝,每天都在學習新東西 – 2014-09-12 16:50:13

+0

當然,假設這些鍵引用了'NSNumber'(或'NSString')對象。 – rmaddy 2014-09-12 16:51:52