我听到过很多关于这个主题的相互矛盾的信息,但总的来说,我听到的是Int类型应该与平台的字长有关,所以例如在32位机器中,Int有4个字节。
除了当我在童年开始在DOS上编码时,我认为我的编译器已经使用了32位Int,即使目标是需要不断使用short的16位处理器(如286)。
今天我编译了一个64位的程序,但Int仍然是32位(短的16位,我不测试长的)。
我知道C标准定义了这一点:short <= int <= long
但是我很好奇,发生了什么?为什么每个人都决定使用一些任意大小的int?
6条答案
按热度按时间rekjcdws1#
C99的基本原理用了很多词来解释为什么
long long
被引入,我引用了关于整数类型历史的部分,我认为它可以回答你的问题,至少部分。第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可能已经用32位的
int
重新实现,从而避免了对long
的需要;但这会使人们将int
的大多数用途改为short
,或者在PDP-11上遭受严重的性能下降。除了对源代码的潜在影响外,即使在1976年,对现有目标代码和数据文件的影响也会更糟。到了20世纪90年代,随着软件的巨大安装基础和动态链接库的广泛使用,在现有环境中改变公共数据对象的大小的影响是如此之大,以至于很少有人会容忍它,尽管在创建新环境时它可能是可接受的。因此,为了避免命名空间冲突,许多供应商使用新名称将64位整数添加到他们的32位C环境中,其中long long
已经被最广泛地使用。oyxsuwqo2#
在过去,内存总线的大小与处理器寄存器的大小相同,这是真的。但不久前就不再是真的了,奔腾是第一个在标准硬件上内存总线大小变得更大的处理器,32位处理器的内存总线大小为64位。这是提高总线吞吐量的一个简单方法。
内存是一个“非常”重要的瓶颈,它比处理器的执行核心慢得多。一个与距离有关的问题是,电信号传输得越远,就越难在高频下切换信号而不破坏信号。
因此,处理器高速缓存的大小以及程序使用它们的效率在很大程度上决定了程序的执行速度,一次高速缓存未命中很容易就会耗费数百个CPU周期。
您的64位处理器并没有获得两倍该高速缓存大小,无论您的程序在32位还是64位模式下执行,L1仍然是32KB指令和32KB数据。芯片上的可用空间,以及最重要的是高速缓存与执行引擎之间的距离是物理约束,由工艺技术的特征大小决定。
因此,生成一个64位的 int,虽然编译器很容易做到,但它对程序速度非常不利。这样的程序使用缓存的效率要低得多,并且在等待内存总线时会遭受更多的停顿。
64位的主要数据模型是LLP64(Microsoft的选择)和LP64(*nix操作系统的选择)。两者都使用32位的 int,LLP64使用32位的 long,LP64使用64位。在两者上,long long 都是64位。
ymdaylpp3#
标准根据整型类型可以表示的值的范围定义了整型类型的最小大小。我不打算全部引用,但可以总结如下:
char
必须 * 至少 * 为8位short
和int
必须 * 至少 * 为16位long
必须 * 至少 * 为32位long long
必须 * 至少 * 为64位同时,引用K&R的话(着重号是我的):
目的是
short
和long
应在实际情况下提供不同长度的整数;int
通常是特定计算机的自然大小。因此,尽管通常会尽可能匹配机器字长,但这绝不是强制性的,因此最终由编译器编写者任意决定
int
是什么-只要它是short
、long
或介于两者之间,并且至少16位。kninwzqo4#
int
是一个合理的默认整数类型,仅此而已,其中包括底层平台最支持的大小等问题,但还有更多的问题。例如,字长可能相当小(8位微控制器),特别是当更大的类型 * 可以 * 被支持并且更普遍地有用时;另一方面,如果字长大于通常所需(64位),现有的程序将不合理地爆炸--甚至因为过去所做的愚蠢假设而崩溃。
pod7payv5#
int
应该是一个整数类型,对于执行环境具有自然大小,但是为了向后兼容,许多编译器甚至在64位环境中也坚持使用32位整数。q7solyqu6#
我在上面写了C99 long long的基本原理,但要了解更多关于这一切是如何发生的历史,请参见2006 ACM Queue,也转载于2009 CACM:通往64位的漫漫长路双倍,双倍,辛苦和麻烦