Objective-C:将对象类型转换为整数\u t
Objective-C:将对象类型转换为整数\u t,objective-c,Objective C,integer\u t是定义为int32\u t的类型定义,经过一些检查后,integer\u t的大小为4个字节,int()的大小也是如此。我的问题是,这样的铸造会产生有效的结果吗 integer_t value = 100; id anObject = @(value); integer_t aValue = [anObject intValue]; aValue是否始终等于value?从长远来看,这会导致任何问题吗?我应该改为long value=[anObject longValue]
integer\u t
是定义为int32\u t
的类型定义,经过一些检查后,integer\u t
的大小为4个字节,int
()的大小也是如此。我的问题是,这样的铸造会产生有效的结果吗
integer_t value = 100;
id anObject = @(value);
integer_t aValue = [anObject intValue];
aValue
是否始终等于value
?从长远来看,这会导致任何问题吗?我应该改为long value=[anObject longValue]
?提前感谢。简短而具体的回答-是的,这些值是相等的,因为integer\u t
和int
两者(根据您的说法,这里是陷阱)具有相同的大小和符号。如果一个是,例如,某种类型的无符号int,那么它将不起作用。如果其中一个是8字节(长)而另一个是4字节(int),则它也不起作用
长期而笼统的答案是——视情况而定。是的,在这里你认为这是平等的,但总有一些有趣的情况你需要注意。我已经提到了规模和标志性,但真正的问题可能是系统架构。因此,您可能会假设它们是相同的,然后有一天您编译了64b arch,所有这些都分解为int
,有8个字节的长度,integer\u t
仍然是4,例如,您也可能会遇到endianness问题。因此,如果您从大型机获得一组int
s,它们可以存储在BADC
中,其中a、B、C和D是int的4个字节
正如您所看到的,很容易吓唬任何使用这些工具的人,实际上这就是为什么会有像NSInteger
-Objective-C这样的东西试图保护您不受这些工具的影响。但是不要害怕,这些都是没有牙齿的怪物,除非你在低级别工作,然后你的工作就是和他们一起工作。听起来不是很有诗意吗
回到代码——不要太担心这些。如果您使用Objective-C,现在可以尝试使用
NSInteger
和NSInteger
类型。如果您存储了这些内容,需要稍后再次加载,那么您需要考虑是否可以从32b arch中存储这些内容,然后将其恢复到64b arch中,并以某种方式解决此问题。只是一条评论-本文的标题有点误导。你对任何事情都没有异议。谢谢你的解释。关于NSInteger
,如果我的源代码(我无权更改它)是uint32\u t
,我认为将其转换为NSInteger
没有任何意义了?建议如果在您的源代码中它被定义为uint32\u t
,请保持这种方式,不要转换。