0

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

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

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

它实际上并没有引起任何问题,但似乎我可能误解了一些东西,所以想更好地理解。

有这个问题,但它解决了安全问题,而不是“为什么”: 我可以安全地将 UInt32 存储到 NSUInteger 吗?

4

2 回答 2

4

在 64 位 OS X 平台上:

  • NSUInteger定义为unsigned long,并且
  • unsigned long是一个 64 位无符号整数。

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

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

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

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

于 2013-03-04T09:36:52.877 回答
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 中我总是使用%ldwithNSInteger但在 iOS 中它必须是%d.

如果你使用%dNSInteger会显示警告 Loses integer precision。

于 2013-03-04T09:34:17.550 回答