4
我正在使用数据类型int32_t为iOS创建一个位掩码。然后将其设置为接受NSInteger的变量。这不会像预期的那样抛出编译时错误,但我想知道 - 是否有某种方式可能会导致未来的运行时错误?int32_t对NSInteger强制转换是否有任何问题?
我正在使用数据类型int32_t为iOS创建一个位掩码。然后将其设置为接受NSInteger的变量。这不会像预期的那样抛出编译时错误,但我想知道 - 是否有某种方式可能会导致未来的运行时错误?int32_t对NSInteger强制转换是否有任何问题?
一般来说,它会起作用。 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
这意味着NSInteger
编译为64时相当于long
位,嵌入式操作系统,iPhone,Windows,或构建32位像64位时。否则,它相当于int
。由于int
和int32_t
是等效的,因此您可以在OS X上的32位应用程序中正常工作。对于其他情况,它取决于long
的大小。
在64位OS X应用程序中,long
是64位数字。在iPhone上,long
是32位数字。我不知道Windows,我不确定在构建像64位这样的32位时它是使用32位还是64位。