Cocoa:NSUInteger和UInt32都定义为32位无符号整数。为什么警告呢?

时间:2013-03-04 09:28:07

标签: objective-c xcode cocoa osx-lion nsuinteger

查看标题,我可以看到,对于我正在编译的64位系统,NSUInteger和UInt32都被定义为32位无符号整数,那么为什么Xcode声称在我发出警告时会出现精度损失将一个分配给另一个?

“隐式转换失去整数精度:'NSUInteger'(又名'unsigned long')到'UInt32'(又名'unsigned int')”

我可以看到警告将一个引用为'long'而一个引用为'int',但由于它们都在此系统上解析为相同的32位无符号整数,因此精度应该没有损失。

这实际上并没有造成任何问题,但似乎我可能误解了一些想要更好理解的东西。

有这个问题,但它涉及安全而不是'为什么': Can I safely store UInt32 to NSUInteger?

2 个答案:

答案 0 :(得分:4)

在64位OS X平台上:

  • NSUInteger定义为unsigned long
  • unsigned long是64位无符号整数。

所以UInt32NSUInteger 具有相同的大小,这解释了编译器警告。

另请参阅“基础数据类型参考”中的NSUInteger

  

构建32位应用程序时,NSUInteger是32位无符号   整数。 64位应用程序将NSUInteger视为64位无符号   整数。

备注: 64位OS X使用(很多Unix和类Unix系统) LP64 数据模型,这意味着指针有64位。 64位Windows使用IL32P64数据模型,其中具有32位且指针具有64位。

答案 1 :(得分:2)

NSUIntegerNSInteger甚至可以在iOS和OSX中使用。

#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

iOS是32位设备,而OSX是64位(早期OSX是32位,甚至您可以选择为32位操作系统创建应用程序),因此它包含if-else directive基于它的设置。

在OSX中,我总是将%ldNSInteger一起使用,但在iOS中,它必须是%d

如果对%d使用NSInteger,则会显示警告丢失整数精度。