我听说过很多关于这个主题的冲突信息,但总的来说我听说Int类型应该与平台字大小有关,所以例如在32位机器中Int有4个字节。
除非我在童年时开始编写DOS编程,我认为我的编译器已使用32位Int,即使目标是16位处理器(如286)需要不断使用短路......
今天我编写了一个64bit的程序只是为了踢,而Int仍然是32位(短16位,我没有长时间测试)。
我知道C标准定义了这个:short <= int <= long
但我很好奇,发生了什么?为什么每个人都决定使用一些任意大小的int?
答案 0 :(得分:3)
C99 Rationale使用大量单词来解释为什么引入long long
,我引用了关于整数类型历史的部分,我认为它可以回答你的问题,至少部分是这样。
Rationale for International Standard — Programming Languages — C§6.2.5类型
在20世纪70年代,16位C(用于PDP-11)首先用16位整数表示文件信息,这些整数很快被磁盘进展所淘汰。人们切换到32位文件系统,首先使用
int[2]
构造,这些构造不仅笨拙,而且无法有效地移植到32位硬件。为了解决这个问题,
long
类型被添加到语言中,即使这需要PDP-11上的C生成多个操作来模拟32位算术。即使32位小型计算机与16位系统一起使用,人们仍然使用int来提高效率,在真正需要更大整数的情况下保留long
,因为long
在16位上效率明显较低系统。short
和long
都添加到C,使short
可用于16位,long
可用于32位,int
可用于提高性能。不希望将数字16或32锁定到语言中,因为存在至少24位和36位CPU的C编译器,而是根据需要提供可用于32位的名称。PDP-11 C可能已经用
int
重新实现为32位,因此无需使用long
;但这会让人们改变int
到short
的大多数用途,或者在PDP-11上遭受严重的性能下降。除了对源代码的潜在影响之外,即使在1976年,对现有目标代码和数据文件的影响也会更糟。到了20世纪90年代,由于安装了大量软件,并且广泛使用动态链接库,在现有环境中更改公共数据对象大小的影响是如此之高,以至于很少有人会容忍它,尽管在创建新环境时可能会接受。因此,为避免命名空间冲突,许多供应商使用新名称在其32位C环境中添加了64位整数,其中long long
是使用最广泛的名称。
答案 1 :(得分:2)
标准根据它们可以表示的值范围定义整数类型的最小大小。我不打算引用它,而是总结一下:
char
必须至少 8位short
和int
必须至少 16位long
必须至少 32位long long
必须至少 64位同时,引用K&amp; R(强调我的):
意图是
short
和long
应该在可行的情况下提供不同长度的整数;int
通常是特定计算机的自然尺寸。
所以尽管如果可能的话,通常会匹配机器字大小,但它绝不是强制性的,所以最终它是编译器编写者的任意决定int
是什么 - 只要它是short
,long
或介于两者之间,至少16位。
答案 2 :(得分:1)
int
旨在成为合理的默认整数类型,仅此而已。这包括诸如底层平台最适合支持哪种大小的问题,但还有更多内容。
例如,字大小可能相当小(8位微控制器),尤其是当支持较大类型的 并且通常更有用时。另一方面,如果单词大于通常需要的(64位),现有的程序会不合理地爆炸 - 甚至因为过去做出的愚蠢假设而中断。
答案 3 :(得分:1)
在过去,当存储器总线大小与处理器寄存器大小相同时,这是正确的。但是,前一段时间已经停止了,奔腾是你在标准硬件上找到的第一个处理器,其内存总线大小更大,32位处理器为64位。一种提高总线吞吐量的简单方法。
内存是非常显着的瓶颈,它比处理器的执行核心慢得多。与距离有关的问题,电信号必须越远,在没有信号损坏的情况下以高频率切换信号就越困难。
因此,处理器高速缓存的大小以及程序可以使用它们的效率严重地决定了程序执行速度。缓存未命中很容易花费百个 cpu周期。您的64位处理器没有达到高速缓存大小的两倍,无论您的程序是在32位还是64位模式下执行,L1仍然是32KB指令和32KB数据。芯片上的可用空间,最重要的是,缓存和执行引擎之间的距离是物理约束,由工艺技术的特征尺寸决定。
因此,使用 int 64位,虽然编译器非常简单,但它对程序速度非常不利。这样的程序使用缓存的效率要低得多,并且在等待内存总线时会受到更多停顿的影响。
64位的显性data models是LLP64,微软选择的,LP64是在* nix操作系统上做出的选择。两者都使用32位用于 int ,LLP64使用32位用于 int ,LP64使用64位。 long long 两者都是64位。
答案 4 :(得分:0)
int
应该是一个整数类型,具有执行环境的自然大小,但为了向后兼容,许多编译器甚至在64位环境中仍然坚持32位整数。