2012-12-03 67 views
3

爲什麼NSUInteger 2^32 - 1的值而不是2^32?這個事實和南方價值的需求之間有什麼關係嗎?這很混亂。NSUInteger和NaN的價值?

+0

此外,通過編程打交道時,你的思維轉移到從0到n-1(n個狀態)計算,而不是1到n的思考。這將對你有所幫助(例如:處理數組,這個問題等等) – RonaldBarzell

+3

Nit:沒有'NaN'整數值。 NSUInteger!= NSFloat。 – 2012-12-03 19:58:00

+1

因爲也是零需要,你可以從1到2^32包括在內。他們選擇從0到2^32-1,但可能值的數量是相同的。 –

回答

8

數到10在你的手指上。真的:)

計數到10的標準方法是1,2,3,..10(每個手指的ordinality計數)。但是,「0指」怎麼樣?

通常情況下,可能代表了把你的手我們的背後,但這增加另一一條信息給系統:在前面(存在)或後面(失蹤)你的手?

在這種情況下,將雙手放在背後將相當於將nil分配給NSNumber變量。然而,NSUInteger表示有這種額外的狀態和仍然必須編碼0是有用的原生整數類型。

編碼在你的手指值爲0的關鍵是簡單地數0,1,2..9代替。相同數量的手指(或信息位)可供選擇,但現在有用0可佔..在不具有10值(還有10個手指,但10日的手指僅代表價值爲代價9 )。這與無符號整數的最大值爲2^n-1而不是2^n的原因相同:它允許0以最大效率進行編碼。

現在,NaN典型的整數值,而是來自浮點編碼 - 想floatCGFloat。一種這樣的共同的編碼是IEEE 754

在計算中,NaN時,靜置不是一個數字,是表示未定義的或不可表示的值的數字數據類型的值,特別是在浮點計算..

+0

「但NSUInteger只是本地整數類型的包裝對象」 - euh。不。這是一個int型或long型的typedef,它不是一個對象。因爲'nil'是一個指針,所以你不能指定'nil'。 – 2012-12-03 20:41:13

+0

@ H2CO3是的,我錯了:(我把它和NSNumber混淆了,謝謝你指出來 – 2012-12-03 20:44:14

+0

不客氣:) – 2012-12-03 20:46:16

2

2^32-1因爲計數從0開始計數。如果更容易將其視爲2^32 - 2^0。

1

不能存儲2^32在4個字節,但是如果減去一個,然後它適合(結果爲0xffffffff)

2

這是一個32位無符號整型變量可以容納最大價值。添加一個,它會繞到零。

其原因是,最小的無符號數爲零,沒有之一。想一想:你可以放進小數點後四位的最大數字是9999,而不是10000,那是10^4-1。

+0

更具體地說,「它將繞回零「如果你在C中嘗試它,因爲下一個更大的值不適合。在數學上,2 ** 32 - 1的下一個較大值是2 ** 32。如果你用二進制編寫,那麼它是1,然後是32個零(就像10 ** 3,在基數10中,是1後面跟着三個零 - 或1000)。 1後跟32個零是33個數字,顯然不適合32位二進制數字(32 *位*)空間。可以容納的最大值是少一個:2 ** 32 - 1. –

0

完全一樣的原因,在您的汽車的里程錶顯示最大的999999英里/公里(假設6位數字) - 同時有10^6個可能的值不能顯示10^6本身,而是從0到10的6次方-1。