long和int的历史背景通常是相同的大小?

dav*_*nal 5 c size int history long-integer

根据无数的答案在这里,longint在对C和C++通用平台尺寸32位(Windows和Linux上,32和64位).(我知道,没有标准,但在实践中,这些都是观察尺寸).

所以我的问题是,这是怎么发生的?为什么我们有两种尺寸相同的类型?我以前总是假设long大部分时间都是64位,而且int我不是说"应该"是这样或那样的,我只是好奇我们是如何到达这里的.

Cha*_*tin 5

从历史上看,C中的大多数尺寸和类型都可以追溯到PDP-11架构.它有字节,字(16位)和双字(32位).当C和UNIX被移动到另一台机器(我认为是Interdata 832)时,字长为32位.保持源兼容,longint严格定义

sizeof(short)sizeof(int)sizeof(long).

大多数机器现在最终都是sizeof(int)= sizeof(long)因为16位不再方便,但是如果需要的话,我们很长时间才能得到64位.

严格更新我应该说"编译器",因为不同的编译器implmentors可以为相同的指令集架构做出不同的决定.例如,海湾合作委员会和微软.


Chr*_*oph 5

从6.2.5节的C99原理(PDF):

[...]在20世纪70年代,16位C(用于PDP-11)首先用16位整数表示文件信息,这些整数很快就被磁盘进展所淘汰.人们切换到32位文件系统,首先使用的int[2] 结构不仅笨拙,而且还无法有效地移植到32位硬件.

为了解决这个问题,将long类型添加到语言中,即使这需要PDP-11上的C生成多个操作来模拟32位算术.即使32位小型计算机与16位系统一起使用,人们仍然习惯于int效率,保留 long真正需要更大整数的情况,因为long在16位系统上效率明显降低.二者shortlong加入到C,使short可用于16位,long为32位,并 int作为方便的性能.不希望将数字16或32锁定到语言中,因为存在至少24位和36位CPU的C编译器,而是根据需要提供可用于32位的名称.

PDP-11 C可能已经int以32位重新实现,因此无需使用long; 但会作出改变人们的大多数使用intshort或遭受的PDP-11S严重的性能下降.除了对源代码的潜在影响之外,即使在1976年,对现有目标代码和数据文件的影响也会更糟.到了20世纪90年代,由于安装了大量软件,并且广泛使用动态链接库,在现有环境中更改公共数据对象大小的影响是如此之高,以至于很少有人会容忍它,尽管在创建新环境时可能会接受.因此,为避免命名空间冲突,许多供应商使用新名称在其32位C环境中添加了64位整数,其中long long使用最广泛的名称.[...]