int的大小是否取决于编译器和/或处理器?

时间:2010-02-25 04:59:45

标签: c++ c types

整数的大小是否取决于编译器,操作系统和处理器?

10 个答案:

答案 0 :(得分:117)

这个问题的答案取决于我们愿意接受的实际考虑距离。

最终,从理论上讲,C和C ++中的所有内容都依赖于编译器,而且只依赖于编译器。硬件/操作系统根本不重要。编译器可以自由地实现任何厚度的硬件抽象层,并且可以模拟任何东西。没有什么可以阻止C或C ++实现实现任何大小的int类型以及任何表示,只要它足够大以满足语言标准中指定的最低要求即可。这种抽象程度的实际例子很容易获得,例如,基于“虚拟机”平台的编程语言,如Java。

但是,C和C ++旨在成为高效高效的语言。为了实现最高效率,C或C ++实现必须考虑从底层硬件派生的某些考虑因素。因此,确保每种基本类型都基于硬件直接(或几乎直接)支持的某种表示非常有意义。从这个意义上说,基本类型的大小取决于硬件。

换句话说,64位硬件/ OS平台的特定C或C ++实现完全可以自由地实现int作为占用128位内存的71位1补码有符号整数类型,使用其他57位作为填充位,总是需要存储编译器作者的女朋友的生日。这种实现甚至具有一定的实用价值:它可用于执行C / C ++程序可移植性的运行时测试。但这就是该实施的实际用途将结束的地方。不要指望在“普通”的C / C ++编译器中看到类似的东西。

答案 1 :(得分:32)

是的,它取决于两个处理器(更具体地说,ISA,指令集架构,例如x86和x86-64)和编译器,包括编程模型。例如,在16位机器中,sizeof(int)是2个字节。 32位计算机的int有4个字节。已经认为int是处理器的 native 大小,即寄存器的大小。然而,32位计算机如此受欢迎,并且已经为32位编程模型编写了大量软件。因此,如果64位计算机的int有8个字节,那将会非常混乱。 Linux和Windows都为int保留4个字节。但是,它们的大小不同long

请查看适用于大多数* nix的 LP64 等64位编程模型以及适用于Windows的 LLP64

当您编写应该在Window和Linux上运行的代码时,这些差异实际上非常令人尴尬。所以,我总是通过stdint.h使用int32_tint64_t而不是long

答案 2 :(得分:7)

是的,它会的。它们的意思是“它依赖于哪个:编译器还是处理器”?在这种情况下,答案基本上是“两者”。通常,int不会大于处理器寄存器(除非它小于16位),但它可能更小(例如,在64位处理器上运行的32位编译器)。但是,通常,您需要一个64位处理器来运行64位int代码。

答案 3 :(得分:6)

基于最近的一些研究,我已经研究过固件访谈:

处理器位体系结构(即8位,16位,32位,64位)的最重要影响是您需要最有效地存储每个字节的信息,以便在最小周期数内最佳地计算变量。

处理器的位大小告诉您CPU在一个周期内能够处理的自然字长。如果在内存中正确对齐,32位机器需要2个周期来处理64位双倍。大多数个人计算机过去和现在仍然是32位,因此最可能的原因是C编译器对32位整数具有典型的亲和性,可选择较大的浮点数和长的整数。

显然,您可以计算更大的变量大小,因此从这个意义上讲,CPU的位体系结构决定了它如何存储更大和更小的变量以实现最佳的处理效率,但它绝不是限制ints或chars的字节大小定义中的因素,这是编译器的一部分,以及由约定或标准规定的内容。

我发现这个网站非常有用,http://www.geeksforgeeks.org/archives/9705,用于解释CPU的自然字长如何影响它如何选择存储和处理更大和更小的变量类型,特别是关于位打包到结构。您必须非常了解如何选择分配变量,因为较大的变量需要在内存中对齐,因此当它们除以CPU的字长时,它们会占用最少的周期数。如果您对变量的分配排序不当,这将为诸如结构之类的内容添加许多可能不必要的缓冲区/空白空间。

答案 4 :(得分:2)

简单而正确的答案是它取决于编译器。它并不意味着架构是无关紧要的,但编译器处理的不是您的应用程序。您可以更准确地说它取决于编译器的(目标)体系结构,例如,如果它的32位或64位。

考虑到你有一个Windows应用程序创建一个文件,它写一个int加上其他东西并读回来。如果你在32位和64位窗口上运行它会发生什么?如果复制在32位系统上创建的文件并在64位系统中打开它会发生什么?

您可能认为int的大小在每个文件中会有所不同,但它们不会相同,这就是问题的症结所在。您可以选择编译器中的设置来定位32位或64位架构,并指示所有内容。

答案 5 :(得分:0)

数据类型大小取决于处理器,因为编译器希望在下一个字节中更容易访问CPU。例如:如果处理器是32位,编译器可能不会选择int size作为2个字节[它应该选择4个字节],因为访问该int的另外2个字节(4字节)将占用额外的CPU周期,这是浪费。如果编译器选择int作为4个字节,CPU可以一次访问完整的4个字节,从而加速应用程序。

由于

答案 6 :(得分:0)

int的大小等于取决于底层ISA的字长。处理器只是ISA的硬件实现,编译器只是ISA的软件端实现。一切都围绕着底层的ISA。目前最受欢迎的ISA是英特尔的IA-32。它的字长为32位或4字节。 4个字节可能是'int'(只是简单的int,而不是short或long)编译器的最大大小。基于IA-32,可以使用。

答案 7 :(得分:0)

数据类型的大小主要取决于编译器的类型,编译器是基于处理器的体系结构设计的,因此外部数据类型可以被认为是编译器相关的。因为整数大小是16位tc编译器中的2字节但gcc编译器中有4个字节,尽管它们是在同一个处理器中执行的

答案 8 :(得分:0)

http://www.agner.org/optimize/calling_conventions.pdf

" 3数据表示"概述了编译器对整数类型的作用。

答案 9 :(得分:-5)

是的,我发现turbo C中的int大小是2个字节,而在MSVC编译器中则是4个字节。

基本上int的大小是处理器寄存器的大小。