如果您需要存储不超过 32 位的值……为什么要使用 long ?
如果您真的可以保证,那么绝对没有理由将 64 位类型的价值超过 32 位类型。对于有界循环、计数器和一般算术等简单操作,32 位整数就足够了。但是对于更复杂的操作,尤其是那些需要高性能应用程序的操作——例如那些执行音频或图像处理的操作——处理器在 64 位模式下可以处理的数据量的增加是显着的。
如果程序处理的是 32 位整数,那么当它占用更多内存时,使用 64 位整数有什么好处?
您使使用更多内存似乎是一件坏事。通过将某些数据类型的大小加倍,它们可以被寻址到内存中的更多位置,并且可以寻址的内存越多,操作系统花费在加载代码上的时间就越少。此外,处理器总线中的数据通道数量是处理器总线数量的两倍,这意味着一次可以处理的值增加一个数量级,而寄存器大小的增加意味着可以将更多的数据保留在一个数量级。一个寄存器。简而言之,这相当于大多数应用程序的速度几乎自动翻倍。
还会有使用 64 位整数与使用 32 位整数产生不同结果的情况?...
是的,但不是你想的那样。32 位数据类型和操作以及 64 位操作(大多数在软件中模拟,或者通过 32 位主机中的特殊硬件或操作码)在大小方面“相对稳定”。由于不同的编译器实现了不同版本的 64 位数据类型(参见LP64、SILP64 和 LLP64)。实际上,这意味着将 64 位类型转换为 32 位类型 - 比如说指向 int 的指针 - 保证会导致信息丢失,但是在保证为 64 位的两种数据类型之间转换 - 指针和长在 LP64 上 - 可以接受。ARM 通常使用 LP64 编译(所有 int 都是 32 位,所有 long 都是 64 位)。同样,大多数开发人员不应该受到开关的影响,但是当您开始处理尝试以整数存储的任意大数字时,精度就会成为问题。
出于这个原因,我建议在公共接口和没有固有边界检查或溢出防护的 API 中使用 NSUInteger 和 NSInteger。例如,TableView 请求 NSUInteger 数量的数据不是因为它担心 32 位和 64 位数据结构,而是因为它不能保证编译它的架构。Apple 尝试制作独立于架构的数据类型实际上有点奢侈,考虑到您只需要做很少的工作即可让您的代码在两种架构中编译并“正常工作”。