最好在64位中使用long或long long

在LP64中, long的大小和long的大小是一样的( Apple Docs , Unix Docs )。

有没有什么区别,当限制自己的理解,你在一个LP64系统上运行(如XCode似乎编译为64位)之间, longlong long之间? 如果你的目标是一个64位积分,是否有任何性能的原因使用long而不是很long long

这就是我问的原因。 在Xcode的Objective C中,NSString的格式(如printf)和NSNumber在转换数字和文本时都使用像intlonglong long这样的数据types,而不是像int16_tint32这样的特定位长度数。 和int64_t 。 这会使得编写需要特定最小大小的事物(例如networking或货币应用程序)或者当您要将特定大小的数据存储到NSNumber而没有types转换的时间很困难。

是否安全,限制于任何英特尔Mac OS或iOS设备,当与NSString的格式函数和NSNumber进行交互时,将int用于int32_tlong long用于int64_t

是否安全,限制于任何英特尔Mac OS或iOS设备,当与NSString的格式函数和NSNumber进行交互时,将int用于int32_t,long long用于int64_t?

根据ILP32和LP64的惯例是的,但你应该真的certificate你是依靠这些尺寸。

一种方法是使用一个聪明的macros(我明白)在Linux内核:

 #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) 

如果该macros的条件参数为true,则该macros将生成编译时错误,因为在这种情况下,它将尝试确定负尺寸数组的大小。 您可以在以下简单的function中使用它:

 static __attribute__((unused)) void _compile_time_use_only_() { BUILD_BUG_ON( (sizeof(int) != 4) ); BUILD_BUG_ON( (sizeof(long long) != 8) ); } 

将其添加到您的代码中,如果您尝试在任何系统上编译int不是32位或long long不是64位,那么您将得到编译时错误。 运行时本质上是零成本的(对于未使用的函数只有几个字节)。

确保你评论function说明它做什么!

你当然可以用同样的方式来确定其他types的大小。

HTH

使用NSInteger或int64_t。 NSInteger =最快的types,至less有32位,并与数组的大小兼容等int64_t =刚好是64位。 这也将使Swift更容易。