Cocoa:NSUInteger vs unsigned int当Range非常小时?

时间:2010-04-03 08:54:04

标签: cocoa int

我有一个unsigned int变量,它的值只能是0 - > 30.我应该使用什么:unsigned int或NSUInteger? (对于32位和64位)

5 个答案:

答案 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 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

答案 4 :(得分:0)

就个人而言,我刚被这个选择所困扰。我沿着NSUInteger路线走了一段路,只是花了很多时间来寻找一个不起眼的小虫。

我的代码选择了一个随机数并返回了一个NSUInteger。代码依赖于溢出的数字。但是我没想到数字的大小在32位和64位系统之间变化。我的其余代码假设(错误地)该数字最大为32位。结果是代码在32位设备下完美运行,但在iPhone 5S上,它们都崩溃了。

使用NSUInteger没有任何问题,但值得记住的是数字范围明显更高,因此将这种动态因素用于您使用该数字进行的任何数学运算。