为什么C语言中sizeof(long long)返回值为8,而非预期的16字节?
C语言long与long long宽度问题解答
C语言标准并没有为long、long long这类基础整数类型指定固定的字节长度,只规定了最低取值范围要求,同时要求类型的宽度满足 char ≤ short ≤ int ≤ long ≤ long long:
long最低需要支持-2^31 ~ 2^31-1的取值范围,对应最小宽度为4字节long long最低需要支持-2^63 ~ 2^63-1的取值范围,对应最小宽度为8字节
只要符合这个要求,编译器可以根据目标平台自由决定具体的类型宽度。
你遇到的现象原因
你运行的测试代码输出两个8的结果,说明你当前使用的是64位Linux、macOS这类采用LP64数据模型的操作系统,这类系统下的C编译器实现中:
long宽度为8字节,满足标准的最低要求long long宽度为8字节,同样满足标准的最低要求(标准仅要求long long宽度≥long的宽度,没有要求必须更大)
如果是在64位Windows系统(采用LLP64数据模型)下,你会得到不一样的结果:long 宽度为4字节,long long 宽度为8字节。
扩展说明
如果需要16字节的超大整数类型,目前主流C编译器普遍支持非标准扩展类型__int128/unsigned __int128,可满足超大整数计算需求。如果需要跨平台保证固定宽度的整数,建议直接使用stdint.h头文件中定义的定宽类型,比如int32_t、uint64_t等,避免不同平台的类型宽度差异导致的问题。
内容的提问来源于stack exchange,提问作者0xdw
相关产品推荐
相关产品推荐

