objective-c - int32_t 到 NSInteger 转换有什么问题吗?

标签 objective-c casting nsinteger int32

我正在使用数据类型 int32_t 为 iOS 创建一个位掩码。然后将其设置为接受 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相当于long为 64 位、嵌入式操作系统、iPhone、Windows 编译时,或者像 64 位一样构建 32 位时。否则,它等同于 int .自 intint32_t是等价的,你在 OS X 上的 32 位应用程序中就可以了。对于其他情况,这取决于 long 的大小。 .

在 64 位 OS X 应用程序中,long是一个 64 位数字。在 iPhone 上,long是一个 32 位数字。我不知道 Windows,我不确定它在像 64 位一样构建 32 位时使用的是 32 位还是 64 位长。

关于objective-c - int32_t 到 NSInteger 转换有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5476701/

相关文章:

objective-c - tableview 上的 setediting = true 使单元格附件 View 消失?

c - 理解下面一行

c# - 将 DataTable 中的列值从 byte[] 转换为 String

objective-c - 为什么 NSInteger 变量在用作格式参数时必须转换为 long?

objective-c - NSInteger 不等于 long ?

ios - NSInteger 乘法 : Invalid operands to binary expression

objective-c - 在 Objective C 中使用 @protocols 的主要原因是什么?

iphone - 多线程如何在 iPhone 上的 Objective-C 中工作?

ios - 如何在iOS的SQLite数据库中更新图像?

c# - 为什么我需要再次将 DataRow 转换为 DataRow?