最好在64位中使用long或long long
在LP64中, long
的大小和long
的大小是一样的( Apple Docs , Unix Docs )。
有没有什么区别,当限制自己的理解,你在一个LP64系统上运行(如XCode似乎编译为64位)之间, long
和long long
之间? 如果你的目标是一个64位积分,是否有任何性能的原因使用long
而不是很long long
?
这就是我问的原因。 在Xcode的Objective C中,NSString的格式(如printf)和NSNumber在转换数字和文本时都使用像int
, long
和long long
这样的数据types,而不是像int16_t
, int32
这样的特定位长度数。 和int64_t
。 这会使得编写需要特定最小大小的事物(例如networking或货币应用程序)或者当您要将特定大小的数据存储到NSNumber而没有types转换的时间很困难。
是否安全,限制于任何英特尔Mac OS或iOS设备,当与NSString的格式函数和NSNumber进行交互时,将int
用于int32_t
, long 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更容易。