int32_t 到 NSInteger 的转换是否有任何问题?
我正在使用数据类型 int32_t 为 iOS 创建位掩码。然后将其设置为接受 NSInteger 的变量。这不会像预期的那样抛出编译时错误,但我想知道 - 是否有某种方法可以在将来导致运行时错误?
I am creating a bitmask for the iOS using the data type int32_t. This is then set to a variable that accepts an NSInteger. This throws no compile time errors as expected, but I was wondering - is there was some way that this could cause run-time errors in the future?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
一般来说,它会起作用。 NSInteger 的长度始终至少为 32 位。如果是 64 位,您的数字将进行符号扩展以匹配(您可能需要对其进行强制转换)。它不会导致运行时错误。
关于 NSInteger 的详细信息
NSInteger 是使用以下代码定义的(来自 NSObjCRuntime.h):
这意味着在编译时
NSInteger
相当于long
64 位、嵌入式操作系统、iPhone、Windows,或构建 32 位(如 64 位)时。否则,它相当于int
。由于int
和int32_t
是等效的,因此在 OS X 上的 32 位应用程序中是可以的。对于其他情况,这取决于long
的大小代码>.在 64 位 OS X 应用程序中,
long
是一个 64 位数字。在 iPhone 上,long
是一个 32 位数字。我不了解 Windows,并且我不确定在构建 32 位(如 64 位)时它是否使用 32 位或 64 位长度。In general, it will work. NSInteger will always be at least 32 bits long. If it is 64 bits, your number will be sign extended to match (you might need to cast it). It will not cause run-time errors.
Detailed info about NSInteger
NSInteger is defined using the following code (from NSObjCRuntime.h):
This means that
NSInteger
is equivalent tolong
when compiling for 64 bit, an embedded OS, iPhone, Windows, or when building 32 bit like 64 bit. Otherwise, it is equivalent toint
. Sinceint
andint32_t
are equivalent, you will be OK in 32 bit applications on OS X. For the other situations, it depends on the size oflong
.In 64 bit OS X applications,
long
is a 64 bit number. On the iPhone,long
is a 32 bit number. I do not know about Windows, and I am not sure whether it uses the 32 bit or 64 bit long when building 32 bit like 64 bit.