我可以安全地将UInt32存储到NSUInteger吗?

时间:2010-05-02 15:02:05

标签: iphone c objective-c

在标题中,定义如下:

#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

UInt32在没有问题的情况下适合NSUInteger(unsigned int)吗? UInt32和unsigned int之间的区别在哪里?

我认为unsigned long大于unsigned int?

2 个答案:

答案 0 :(得分:9)

我认为UInt32unsigned int之间的唯一区别是UInt32保证为32位长,而unsigned int技术上可能更短你正在运行(比如说)< 32位操作系统。

但是,鉴于Mac和iPhone都至少是32位系统,因此可以合理地互换使用unsigned intUInt32NSUInteger。这里唯一的区别是NSUInteger可能是64位长(在Mac上,编译x86_64时)。

至于您对unsigned longunsigned int的问题,UInt32是对unsigned long的类型定义,再次表明可互换使用是安全的。 unsigned long保证至少与unsigned int一样大。

答案 1 :(得分:1)

您可以随时在程序的初始部分添加一些环境检查代码,以最大限度地减少意外:

 if (sizeof(NSUInteger) != sizeof(UInt32)) {
     printf("Error: Wrong integer type size!\n");
     exit(0);
 }