【发布时间】:2011-03-29 17:47:24
【问题描述】:
我正在使用数据类型 int32_t 为 iOS 创建一个位掩码。然后将其设置为接受 NSInteger 的变量。这不会像预期的那样引发编译时错误,但我想知道 - 是否有某种方式可能会在未来导致运行时错误?
【问题讨论】:
标签: objective-c casting nsinteger int32
我正在使用数据类型 int32_t 为 iOS 创建一个位掩码。然后将其设置为接受 NSInteger 的变量。这不会像预期的那样引发编译时错误,但我想知道 - 是否有某种方式可能会在未来导致运行时错误?
【问题讨论】:
标签: objective-c casting nsinteger int32
一般来说,它会起作用。 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。由于int 和int32_t 是等价的,所以在OS X 上的32 位应用程序中是可以的。对于其他情况,取决于long 的大小。
在 64 位 OS X 应用程序中,long 是一个 64 位数字。在 iPhone 上,long 是一个 32 位数字。我不了解Windows,我不确定它在构建32位时是否像64位一样使用32位或64位。
【讨论】: