在x86 / amd64中,sizeof(long long)
为8。
让我引用颇具洞察力的8岁mail by Zack Weinberg:
斯科特罗伯特拉德写道:在64位AMD64架构上,GCC将
long long
定义为64位,即 与long
相同。鉴于某些64位指令(乘法)产生128位 结果,
long long
被定义为128位似乎不合逻辑吗?不,有两个原因:
64位“
long long
”的选择已写入ABI 大多数LP64型操作系统;我们不能单方面改变它。- 醇>
这实际上是正确的选择,因为它消除了像差 这使得'
long
'不是最宽的基本积分类型。有 在野外写下了很多很多代码sizeof(long) >= sizeof(size_t)
- 这至少是潜在的 由ABI打破,其中长多头比较长。(这是一个极具争议的话题 C99。从外部角度来看,我可以说“
long long
” 由于微软的压力无法实现,因此只是标准化了 某种原因实现了LP64模型。其他人都讨厌这个想法 使'long
'不一定是最宽的基本积分类型。)目前最佳做法似乎是提供“扩展积分 输入“
__int128
。这不会出现'long long
'的问题,因为 它不是基本整数类型(特别是它不能用于size_t
)。ZW
long long
是最广泛的基本整数类型。在我所知道的任何非死亡架构/ 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
好,因为:
PRId64
/ PRIu64
%lld
/ %llu
)但是这个解决方案的可移植性可以通过以下问题的答案来表达。
sizeof(long long) != 8
哪些架构/ ABI?
如果你不能提供任何近期/现代的,那么继续使用旧的,但只有当它们仍然在使用时。
答案 0 :(得分:8)
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
答案 1 :(得分:-1)
您的“跨平台”typedef只是被误导了。正确的是
#include <stdint.h>
typedef int8_t s8;
typedef uint8_t u8;
typedef int16_t s16;
...