我有一個無符號的int變量,它只能有0 - > 30的值。我應該使用什麼:unsigned int或NSUInteger? (對於32位和64位)可可:NSUInteger vs unsigned int當範圍非常小?
回答
運行此:
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的兩倍。
它在你的情況下幾乎沒有什麼區別,沒有對錯。我可能會使用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
當U真的要使用一些無符號的類型的,unsigned int
和NSUInteger
之間的選擇並不重要,因爲這些類型是相等的(比較在32的範圍和大小& 64位)。這同樣適用於int
和NSInteger
:
#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
謝謝。所以在64位我的NSUInteger將是一個無符號長右鍵?這不會佔用兩倍的內存,只是使用int? – 2010-04-03 09:28:03
我會用NSUInteger
(作爲Cocoa中慣用的無符號整數類型)或uint8_t
(如果大小很重要)。如果我期望在幾個地方爲相同類型的數據使用0-30個值,我會輸入它來描述它代表的內容。
+1用於思考理論上最正確的是什麼,而不是僅浪費多少字節。 – andyvn22 2010-04-03 14:56:28
就我個人而言,我剛被這個選擇咬了。我沿着NSUInteger路線走下去,剛剛花了幾個小時看着一個晦澀的bug。
我有選擇一個隨機數並返回一個NSUInteger的代碼。代碼依賴於數字的溢出。不過,我並沒有預料到這個數字的大小在32位和64位系統之間有所不同。我的代碼的其餘部分假設(不正確)該數字將達到32位大小。結果是代碼在32位設備下完美工作,但在iPhone 5S上,這一切都崩潰了。
使用NSUInteger沒有什麼問題,但是值得記住的是數字範圍要高得多,所以把這種動態主義歸因於你用這個數字做的任何數學運算。
- 1. NSUInteger vs NSInteger,int vs unsigned以及類似的情況
- 2. BIGINT UNSIGNED值超出了範圍非常小(4char)值
- 3. 回顧C++中unsigned int的範圍?
- 4. unsigned long long VS unsigned long long int
- 5. Python範圍可變vs不可變
- 6. unsigned int的VS在C++
- 7. 當該範圍是可變
- 8. 調用'(std :: pair <unsigned int,unsigned int>)(unsigned int&,unsigned int)'
- 9. 爲unsigned long long值範圍
- 10. Java int的VS整數 - 不同範圍
- 11. BIGINT UNSIGNED值超出範圍
- 12. 十六進制nsuinteger可可
- 13. Angularjs:$範圍vs範圍
- 14. int或NSInteger爲NSUInteger索引
- 15. jquery datetimepicker可選範圍小時
- 16. Haskell是否提供Int範圍的最小/最大常量?
- 17. 我可以查詢當前範圍嗎?
- 18. 理論上實現是否可以將unsigned int提升爲int?
- 19. 它是否有可能會將int *轉換爲unsigned int *
- 20. JavaScript可變範圍
- 21. Javascript可變範圍
- 22. Java - 可變範圍
- 23. Javascript可變範圍
- 24. 讓可變範圍
- 25. 範圍的可變
- 26. Bash可變範圍
- 27. λ可變範圍
- 28. Javascript可變範圍
- 29. C++可變範圍
- 30. 角$範圍可變
謝謝。所以在64位我的NSUInteger將是一個無符號長右鍵?這不會佔用兩倍的內存,只是使用int? – 2010-04-03 09:27:41
是的,沒錯。在64位目標上,「long」將是8個字節,而「int」將是4個字節。在32位上,「int」和「long」是相同的。 – 2010-04-03 09:56:26