在x86 / amd64中, sizeof(long long)
是8 .
让我引用颇具洞察力的8岁mail by Zack Weinberg:
Scott Robert Ladd写道:在64位AMD64架构上,GCC将long长定义为64位,与长整数相同 . 假设某些64位指令(乘法)产生128位结果,那么long long定义为128位似乎不合逻辑吗?不,有两个原因:64位“long long”的选择已被写入大多数LP64模型操作系统的ABI中;我们不能单方面改变它 . 这实际上是正确的选择,因为它消除了使“长”不是最宽的基本积分类型的像差 . 野外有很多很多代码写成sizeof(long)> = sizeof(size_t)的假设 - 这至少可能被长期宽于长的ABI所破坏 . (在C99的开发过程中,这是一个极具争议的话题 . 从外部角度来看,“长期”只是由于微软的压力而标准化,因为微软不能出于某种原因实施LP64模型 . 讨厌让'long'不一定是最宽泛的基本积分类型的想法 . )目前最好的做法似乎是提供一个“扩展积分型”__int128 . 这没有'long long'的问题,因为它不是基本的整数类型(特别是它不能用于size_t) . ZW
long long
是最宽的 basic 整数类型 . 在我所知道的任何非死亡架构/ ABI上它都是64位长 . 这允许使用简单的跨平台(好吧,至少对于许多32/64位架构)typedef:
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
(我很清楚,自2005年以来,Visual C仅支持%lld
/%llu
)
但是这个解决方案的可移植性可以通过以下问题的答案来表达 .
What are the architectures/ABIs where sizeof(long long) != 8?
如果你不能提供任何近期/现代的,那么继续使用旧的,但只有当它们仍在使用时 .
2 回答
TI TMS320C55x架构具有16位的
CHAR_BIT
和40位的long long
. 虽然40位long long
违反了ISO,但sizeof (long long)
与8不同 .实际上几乎所有带有
CHAR_BIT > 8
的C99实现都有sizeof (long long) != 8
.TMS320C55x优化C / C编译器用户指南(2003)http://www.ti.com/lit/ug/spru281f/spru281f.pdf
您的“跨平台”typedef只是被误导了 . 正确的是