在x86/amd 64世界中,sizeof(long long)
是8。
让我引用8岁的mail by Zack Weinberg的话:
斯科特罗伯特拉德写道:
在64位AMD 64架构上,GCC将long long
定义为64位,与long
相同。
考虑到某些64位指令(乘法)产生128位结果,将long long
定义为128位似乎不符合逻辑吗?
不,原因有二:
1.选择64位'long long
'已写入大多数LP 64型号操作系统的ABI;我们不能单方面改变它。
1.这实际上是正确的选择,因为它消除了使'long
'不是最广泛的基本整型的偏差。有很多很多代码都是针对sizeof(long) >= sizeof(size_t)
的假设编写的-这至少有可能被ABI打破,其中long long比long宽。
(This在C99的开发过程中,“long long
”是一个极具争议的主题。据我所知,从外部的Angular 来看,“long long
”只是在微软的压力下才被标准化的,微软出于某种原因不能实现LP 64模型。其他所有人都讨厌让“long
”不一定是最广泛的基本整型的想法。)
目前最好的实践似乎是提供一个“扩展整型”__int128
,它没有“long long
”的问题,因为它不是一个 basic 整型(特别是,它不能用于size_t
)。
中纬long long
是最广泛的basic整型类型,在我所知道的任何非过时的架构/ABI上它都是64位长,这允许使用简单的跨平台(至少对于许多32/64位架构)typedefs:
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++从2005年起才支持%lld
/%llu
)
但是这个解决方案的可移植性如何可以通过对以下问题的回答来表达。
sizeof(long long) != 8
的体系结构/ABI是什么?
如果你不能提供任何最新的/现代的,那么就继续使用旧的,但前提是它们仍然在使用。
3条答案
按热度按时间djmepvbi1#
TI公司的TMS 320 C55 x架构有16位的
CHAR_BIT
和40位的long long
,虽然40位的long long
违反了ISO标准,但sizeof (long long)
与8位不同。实际上,几乎所有使用
CHAR_BIT > 8
的C99实现都有sizeof (long long) != 8
。TMS 320 C55 x优化C/C++编译器用户指南(2003)http://www.ti.com/lit/ug/spru281f/spru281f.pdf
gcxthw6b2#
“在C99的开发过程中,这是一个极具争议的主题。据我所知,从外部的Angular 来看,“long long”只是在微软的压力下才被标准化的,微软出于某种原因不能实现LP 64模型。其他人都讨厌让“long”不一定是最广泛的基本整数类型的想法。”
这在Unix厂商中引起了争议,没有提到微软,微软有很多I16 LP 32代码,其中唯一的32位整数是长整数,所以他们似乎不想改变这一点。
UNIX和其他供应商有ILP 32或Amdahl、Convex等ILP 32 LL 64,因此需要64位数据类型,就像PDP-11在20世纪70年代中期必须是IP 16 L32才能获得32位数据类型而不是int X[2]。
详细的历史,这里有一篇2006年发表在ACM Queue上的文章,后来在2009年的CACM上重印。请特别参见表1。“64位的漫漫长路,双倍,双倍,辛劳和麻烦”https://queue.acm.org/detail.cfm?id=1165766另外,如果你读过C99,我写过long long的基本原理。在论文中描述的会议中,我们分成了两部分:IL 32 LLP 64-保留long为32位ILP 64-使int和long为64,引入新类型为32 LP 64-使long为64,保留int为32每个都有很好的论据,但论据有效地解决了一个事实,即最早推出64位微处理器的两家公司都采用了LP 64。
jaxagkaj3#
您的“跨平台”typedef只是被误导了。