2010-04-03 28 views

回答

1

運行此:


    int sizeLong = sizeof(unsigned long); 
    int sizeInt = sizeof(unsigned int); 
    NSLog(@"%d, %d", sizeLong, sizeInt); 

在64位給出了: 8, 4 在32位給出了: 4, 4 所以,是的,在64位無符號長( NSUInteger)在32位上的佔用量是NSUInteger的兩倍。

0

它在你的情況下幾乎沒有什麼區別,沒有對錯。我可能會使用NSUInteger,只是爲了匹配可可API的東西。

NSUInteger的定義是這樣的:

#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 
+0

謝謝。所以在64位我的NSUInteger將是一個無符號長右鍵?這不會佔用兩倍的內存,只是使用int? – 2010-04-03 09:27:41

+0

是的,沒錯。在64位目標上,「long」將是8個字節,而「int」將是4個字節。在32位上,「int」和「long」是相同的。 – 2010-04-03 09:56:26

0

當U真的要使用一些無符號的類型的,unsigned intNSUInteger之間的選擇並不重要,因爲這些類型是相等的(比較在32的範圍和大小& 64位)。這同樣適用於intNSInteger


#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 
+0

謝謝。所以在64位我的NSUInteger將是一個無符號長右鍵?這不會佔用兩倍的內存,只是使用int? – 2010-04-03 09:28:03

3

我會用NSUInteger(作爲Cocoa中慣用的無符號整數類型)或uint8_t(如果大小很重要)。如果我期望在幾個地方爲相同類型的數據使用0-30個值,我會輸入它來描述它代表的內容。

+0

+1用於思考理論上最正確的是什麼,而不是僅浪費多少字節。 – andyvn22 2010-04-03 14:56:28

0

就我個人而言,我剛被這個選擇咬了。我沿着NSUInteger路線走下去,剛剛花了幾個小時看着一個晦澀的bug。

我有選擇一個隨機數並返回一個NSUInteger的代碼。代碼依賴於數字的溢出。不過,我並沒有預料到這個數字的大小在32位和64位系統之間有所不同。我的代碼的其餘部分假設(不正確)該數字將達到32位大小。結果是代碼在32位設備下完美工作,但在iPhone 5S上,這一切都崩潰了。

使用NSUInteger沒有什麼問題,但是值得記住的是數字範圍要高得多,所以把這種動態主義歸因於你用這個數字做的任何數學運算。