查看标题,我可以看到,对于我正在编译的64位系统,NSUInteger和UInt32都被定义为32位无符号整数,那么为什么Xcode声称在我发出警告时会出现精度损失将一个分配给另一个?
“隐式转换失去整数精度:'NSUInteger'(又名'unsigned long')到'UInt32'(又名'unsigned int')”
我可以看到警告将一个引用为'long'而一个引用为'int',但由于它们都在此系统上解析为相同的32位无符号整数,因此精度应该没有损失。
这实际上并没有造成任何问题,但似乎我可能误解了一些想要更好理解的东西。
有这个问题,但它涉及安全而不是'为什么': Can I safely store UInt32 to NSUInteger?
答案 0 :(得分:4)
在64位OS X平台上:
NSUInteger
定义为unsigned long
和unsigned long
是64位无符号整数。所以UInt32
和NSUInteger
不具有相同的大小,这解释了编译器警告。
另请参阅“基础数据类型参考”中的NSUInteger:
构建32位应用程序时,NSUInteger是32位无符号 整数。 64位应用程序将NSUInteger视为64位无符号 整数。
备注: 64位OS X使用(很多Unix和类Unix系统) LP64 数据模型,这意味着长和指针有64位。 64位Windows使用IL32P64数据模型,其中长具有32位且指针具有64位。
答案 1 :(得分:2)
NSUInteger
和NSInteger
甚至可以在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中,我总是将%ld
与NSInteger
一起使用,但在iOS中,它必须是%d
。
如果对%d
使用NSInteger
,则会显示警告丢失整数精度。