我有一个unsigned int变量,它的值只能是0 - > 30.我应该使用什么:unsigned int或NSUInteger? (对于32位和64位)
答案 0 :(得分:3)
我会使用NSUInteger
(作为Cocoa中的惯用通用无符号整数类型)或uint8_t
(如果大小很重要)。如果我希望在相同类型的数据的几个地方使用0-30值,我会键入它来描述它代表的内容。
答案 1 :(得分: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的两倍。
答案 2 :(得分:0)
在你的情况下,它没有什么区别,没有对错。我可能会使用NSUInteger,只是为了匹配Cocoa 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
答案 3 :(得分:0)
当你真的想要使用某些无符号类型时,在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
答案 4 :(得分:0)
就个人而言,我刚被这个选择所困扰。我沿着NSUInteger路线走了一段路,只是花了很多时间来寻找一个不起眼的小虫。
我的代码选择了一个随机数并返回了一个NSUInteger。代码依赖于溢出的数字。但是我没想到数字的大小在32位和64位系统之间变化。我的其余代码假设(错误地)该数字最大为32位。结果是代码在32位设备下完美运行,但在iPhone 5S上,它们都崩溃了。
使用NSUInteger没有任何问题,但值得记住的是数字范围明显更高,因此将这种动态因素用于您使用该数字进行的任何数学运算。