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


75

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


我回答说是处理器...可能我错了:(
Vijay 2010年

也许您应该重新命名您的问题帖子?您似乎只关心int的大小,而不关心char(根据定义,大小为1,与编译器或处理器无关)。
空虚


3
“为什么要进行密切投票?” 一个对自己的信誉有100多个问题的人应该知道应该首先搜索...
dmckee ---前主持人小猫

3
重要的是要记住,“ int”和“ integer”是两种不同的事物:int是几种整数类型之一。
基思·汤普森

Answers:


132

这个问题的答案取决于我们愿意得到多大的实际考虑。

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

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

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


8
为了完整性,我只引用C ++标准:“普通整数具有执行环境的体系结构建议的自然大小。” 由编译器作者决定“自然”的含义。
Mike Seymour'2

1
我不明白您的答案。能否通过讨论硬件,操作系统,编译器在确定诸如的数据类型的大小方面发挥作用来改善您的答案int。开场白说,一切都取决于编译器,但随后提到了一些硬件约束来提高效率,请您讨论一下。
YEP 2012年

2
@YEP:我看不到矛盾。“硬件约束”根本不是约束。这些仅仅是为了产生最有效的代码而必须遵循的建议。但是,如果您不关心已编译代码的最大可实现效率,则可以实现一个完全忽略任何硬件注意事项的编译器。
AnT 2012年

1
我想说实用性可能会进一步提高。如果编译器作者需要记住女友的生日该怎么办?:v
Suchipi 2014年

1
我喜欢编译器可以做任何事情的想法。我将实现一个分形整数,其中存储的是整数的熵,而返回的是热量。
Erik Aronesty,2015年

38

是的,它取决于两个处理器(更具体地说,是ISA,指令集体系结构,例如x86和x86-64)和包括编程模型的编译器。例如,在16位计算机中,sizeof(int)为2个字节。32位机器有4个字节用于int。已经考虑到处理器int本机大小,即寄存器的大小。但是,32位计算机是如此流行,并且已经为32位编程模型编写了大量软件。因此,如果64位计算机具有8个字节的,这将非常令人困惑int。Linux和Windows都保留4个字节的int。但是,它们的大小不同long

请查看64位编程模型,例如大多数* nix的LP64和Windows的LLP64

当您编写在Window和Linux上都可以使用的代码时,这样的差异实际上非常令人尴尬。因此,我一直在使用int32_tor int64_t,而不是long通过stdint.h


1
一个小错字,你提到的sizeof(int)是16的16位计算机上,但它更可能是2
dreamlax

谢谢!16位或2个字节。已更正。
2010年

如果您需要的类型是“至少32位”,那么long就足够了,并且如果时间太长也不会造成问题。主要的例外是直接读取或写入磁盘或网络格式时。
caf 2010年

2
@caf-永远不要假设long> = 32位。可能是,但是不要指望它。我使用的编译器使用1short8int16long。使用int32_t代替。
Mark Lakata 2014年

@MarkLakata:无论语言编译器编译,这不是C. long必须能够代表所有的数字范围-2147483647到2147483648
CAF

7

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


您回答的第一部分对我很有启发。当您说“您需要一个64位处理器来运行具有64位int的代码”时,我感到困惑。我了解到,可以通过将机器分解成较小的块来处理大于机器本机大小的int。将会有一些性能损失。不是吗?
KawaiKx

@Sarurabh:我非常特别地评论了名为的类型int。许多(大多数?)32位编译器具有64位类型,但是其名称不同(例如__int64long long)。
杰里·科芬

7

根据最近的一些研究,我已经完成了固件访问的研究:

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

处理器的位大小告诉您CPU在一个周期内可以处理的自然字长。如果32位计算机在内存中正确对齐,则需要2个周期来处理64位double。大多数个人计算机现在还是现在都是32位的,因此C编译器对32位整数的典型亲和力以及更大的浮点数和长整型的选项是最可能的原因。

显然,您可以计算较大的变量大小,因此从某种意义上说,CPU的位体系结构决定了如何存储较大和较小的变量,以实现最佳的处理效率,但这绝不是字节大小定义的限制因素对于整数或字符,这是编译器的一部分,由约定或标准规定。

我发现该站点对http://www.geeksforgeeks.org/archives/9705非常有帮助,可以解释CPU的自然字长如何影响它将如何选择存储和处理更大或更小的变量类型,尤其是在位打包方面成结构。您必须非常了解如何选择分配变量,因为较大的变量需要在内存中对齐,因此除以CPU的字长后,它们占用的循环次数最少。如果您对变量的分配顺序不佳,则会为诸如struct之类的东西增加很多潜在的不必要的缓冲区/空空间。


2

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

考虑您有一个Windows应用程序,该应用程序会创建一个文件,在其中写入int其他内容并回读。如果在32位和64位窗口上都运行此命令会发生什么?如果复制在32位系统上创建的文件并在64位系统上打开文件,会发生什么情况?

您可能会认为int的大小在每个文件中会有所不同,但是不一样,这是问题的症结所在。您选择编译器中的设置以目标为32位或64位体系结构,这决定了一切。


0

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

谢谢


1
这是假的:“数据类型的大小取决于处理器,因为编译器希望使下一个字节更容易访问CPU”。编译器不是一个人,它没有想要的东西。您可以采用任何方式实现编译器。无论采用何种度量标准,生成的代码的效率都是一个问题,但是与标准无关。正如其他回答者所说的那样,您可以自由地生成一个二进制图像,其中在每条指令之间都插入了女友的出生日期:)关于CPU可能会或可能不会执行wrt循环等的抽象讨论是没有意义的。
库巴并没有忘记莫妮卡

0

int的大小等于取决于基础ISA的字长。处理器只是ISA的硬件实现,而编译器只是ISA的软件侧实现。一切都围绕基础ISA。如今,最受欢迎的ISA是Intel的IA-32。它的字长为32位或4字节。4个字节可能是'int'编译器的最大大小(仅是普通int,不是短或长)。基于IA-32,可以使用。


0

数据类型的大小基本上取决于编译器的类型,并且编译器是根据处理器的体系结构设计的,因此外部数据类型可以视为依赖于编译器。例如,整数的大小在16位tc编译器中为2字节,而在4字节时为4字节。在gcc编译器中,尽管它们在同一处理器中执行



-5

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

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


“基本上,int的大小是处理器寄存器的大小。” -这是不正确的,请参阅其他答案。
hobodave 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.