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
,请保持这种方式,不要转换。