2010-03-31 43 views
28

任何人都有專業知識來解釋何時使用NSUInteger以及何時使用NSInteger?NSUInteger vs NSInteger,int vs unsigned以及類似的情況

我看到Cocoa方法返回NSInteger,即使在返回值總是未經簽名的情況下。

什麼是根本原因?如果我們想要表示負值,NSInteger或int是否嚴格限制?

從NSObjCRuntime.h:

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef long NSInteger; 
typedef unsigned long NSUInteger; 
#else 
typedef int NSInteger; 
typedef unsigned int NSUInteger; 
#endif 

回答

30

與NSUInteger處理與NSInteger的時候你也應該知道的整數變換法則:

例如下面的片段返回0(假),但你希望它打印1(真):

NSInteger si = -1; 
NSUInteger ui = 1; 
printf("%d\n", si < ui); 

原因是[si]變量被隱式轉換爲unsigned int!

請參閱CERT's Secure Coding site瞭解有關這些「問題」的深入討論以及如何解決這些問題。

+0

這是新的鏈接https://www.securecoding.cert.org/confluence/display/c/INT02-C.+Understand+integer+conversion+rules – 2016-09-16 19:03:14

7

如果你的方法有適當限制的輸出範圍,你還不如用NSInteger,因爲它更容易一些。正如你所說,如果你需要返回負數,NSInteger是鎮上唯一的遊戲;我只使用NSUInteger如果我需要返回真的大數字出於某種原因。

+1

對於更大的數字,請使用NSDecimalNumber獲取38個基數爲10的精度。 – codewarrior 2010-03-31 23:42:38

+0

+1,@codewarrior,只有當你可以傳遞類時,儘管如此。 – 2010-03-31 23:46:19

+7

我走另一條路:除了當我需要負數時,我總是使用NSUInteger。另外,你的意思是對象,而不是類;幾乎沒有理由傳遞類,更沒有特別通過NSDecimalNumber類的理由。 – 2010-04-03 02:26:49

5

我不知道可可專門,但通常唯一的缺點是有符號整數是他們通常有一半的最大值作爲無符號整數。如32位系統的約20億而不是40億。一般來說,這不是一個很大的差別,因爲如果你處理的價值接近20億,你可能會同樣擔心在同一個案例中最大40億,因爲它仍然非常接近溢出,只有一個乘以2或3.

帶符號的整數通常是首選,因爲在幾乎所有場景中都可以使用帶符號整數的附加靈活性和事實,無符號整數可以加上所需的所有附加場景。

如果要強制使用正值,則可能會首選無符號值。

+0

我添加了NSInteger和NSUInteger的定義。 – 2010-03-31 23:47:52

+4

有時使用帶符號整數,即使在正常範圍爲正值的情況下,如果您希望能夠將變量初始化爲「無效」值(例如-1),也可以使用。 – progrmr 2010-04-01 00:01:49

+3

有趣的是,替代Objective C的Swift表示,在可能的情況下總是使用帶符號的數字。 *來自文檔*: 僅當您特別需要與平臺的本機字大小相同的無符號整數類型時才使用UInt。如果不是這種情況,即使要存儲的值已知爲非負數,Int也是首選。 Int一致地使用整數值有助於代碼互操作性,避免了在不同數字類型之間進行轉換的需要,並匹配整數類型推斷,如類型安全和類型推斷中所述。 – Skotch 2014-07-03 16:14:44

17

默認情況下,整數被假定爲有符號。換句話說,編譯器假定將調用一個整數變量來存儲負數或正數。這限制了範圍可以在任何方向上達到的程度。例如,32位int的範圍是4,294,967,295。實際上,因爲這個值可能是正值或負值,所以範圍實際上是-2,147,483,648到+2,147,483,647。如果我們知道某個變量永遠不會被調用來存儲負值,我們可以聲明它爲無符號的,從而將(正)範圍擴展到0到+4,294,967,295。所以我會說,當你知道你的輸出範圍有限時,可以使用NSInteger。我個人使用NSUInteger,如果我需要返回非常大的正數唯一數字

+0

好的答案和什麼我需要知道:) – mAc 2017-05-08 18:24:55

+0

如果我想存儲-4,294,967,295怎麼辦?我不能使用NSInteger呢? – Nil 2017-05-16 08:03:56

+0

@Nil long long int:-9,223,372,036,854,775,807 to 9,223,372,036,854,775,807 unsigned long long int:0至18,446,744,073,709,551,615。在您的賬戶中有相當大的數額:D – 2017-10-27 14:45:10