【问题标题】:Are there any issues with int32_t to NSInteger casting?int32_t 到 NSInteger 转换是否有任何问题?
【发布时间】:2011-03-29 17:47:24
【问题描述】:

我正在使用数据类型 int32_t 为 iOS 创建一个位掩码。然后将其设置为接受 NSInteger 的变量。这不会像预期的那样引发编译时错误,但我想知道 - 是否有某种方式可能会在未来导致运行时错误?

【问题讨论】:

    标签: objective-c casting nsinteger int32


    【解决方案1】:

    一般来说,它会起作用。 NSInteger 将始终至少为 32 位长。如果它是 64 位,您的号码将被符号扩展以匹配(您可能需要转换它)。它不会导致运行时错误。


    关于 NSInteger 的详细信息

    NSInteger 使用以下代码定义(来自 NSObjCRuntime.h):

    #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
    

    这意味着在编译 64 位、嵌入式操作系统、iPhone、Windows 或构建 32 位(如 64 位)时,NSInteger 等效于 long。否则,它等价于int。由于intint32_t 是等价的,所以在OS X 上的32 位应用程序中是可以的。对于其他情况,取决于long 的大小。

    在 64 位 OS X 应用程序中,long 是一个 64 位数字。在 iPhone 上,long 是一个 32 位数字。我不了解Windows,我不确定它在构建32位时是否像64位一样使用32位或64位。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      • 2012-10-08
      • 1970-01-01
      相关资源
      最近更新 更多