在 x86/amd64 中,世界sizeof(long long)
是 8。
让我引用扎克·温伯格(Zack Weinberg)颇有见地的 8 年邮件:
斯科特·罗伯特·拉德写道:
在 64 位 AMD64 架构上,GCC 定义
long long
为 64 位,与long
.
long long
鉴于某些 64 位指令(乘法)产生 128 位结果,将其定义为 128 位似乎不合逻辑吗?不,有两个原因:
long long
大多数 LP64 型号操作系统的 ABI 中都写入了64 位 ' ' 的选择;我们不能单方面改变它。这实际上是正确的选择,因为它消除了使 '
long
' 不是最广泛的基本整数类型的像差。在野外有很多代码是为了假设sizeof(long) >= sizeof(size_t)
- 这至少可能被 ABI 破坏,其中 long long 比 long 更宽。(在 C99 的开发过程中这是一个非常有争议的话题。据我所知,从外部角度来看,“
long long
”只是由于微软的压力而被标准化,微软由于某种原因无法实现 LP64 模型。其他人都讨厌使 'long
' 不一定是最广泛的基本整数类型的想法。)当前的最佳做法似乎是提供“扩展整数类型”
__int128
。这不存在 'long long
' 的问题,因为它不是基本的整数类型(特别是不能用于size_t
)。zw
long long
是最宽的基本整数类型。在我知道的任何非死旧架构/ABI 上,它都是 64 位长的。这允许使用简单的跨平台(嗯,至少对于许多 32/64 位架构)类型定义:
typedef char s8;
typedef unsigned char u8;
typedef short s16;
typedef unsigned short u16;
typedef int s32;
typedef unsigned int u32;
typedef long long s64;
typedef unsigned long long u64;
比 更好intXX_t
,因为:
- 他们在不同平台上对 64 位整数使用相同的底层类型
- 允许避免冗长的
PRId64
/PRIu64
(我很清楚 Visual C++ 支持%lld
/%llu
仅自 2005 年起)
但是这个解决方案的可移植性可以通过以下问题的答案来表达。
什么是架构/ABI sizeof(long long) != 8
?
如果您不能提供任何最近/现代的,那么请继续使用旧的,但前提是它们仍在使用中。