整数的大小是否取决于编译器,操作系统和处理器?
int
是几种整数类型之一。
整数的大小是否取决于编译器,操作系统和处理器?
int
是几种整数类型之一。
Answers:
这个问题的答案取决于我们愿意得到多大的实际考虑。
最终,从理论上讲,C和C ++中的所有内容都取决于编译器,并且仅取决于编译器。硬件/操作系统根本不重要。编译器可以自由实现任何厚度的硬件抽象层,并且可以完全模拟任何东西。没有什么可以阻止C或C ++实现实现int
任何大小和任何表示形式的类型,只要它的大小足以满足语言标准中指定的最低要求即可。这样的抽象水平的实际例子是容易获得的,例如基于诸如Java的“虚拟机”平台的编程语言。
但是,C和C ++旨在成为高效的语言。为了获得最大效率,C或C ++实现必须考虑从底层硬件派生的某些注意事项。因此,确保每种基本类型都直接(或几乎直接)基于硬件支持的某种表示形式非常有意义。从这个意义上说,基本类型的大小确实取决于硬件。
换句话说,针对64位硬件/ OS平台的特定C或C ++实现绝对可以自由地实现int
为占用128位内存的71位1的补码有符号整数类型,而将其他57位用作填充位存储编译器作者女友的生日总是需要的。该实现甚至将具有一定的实用价值:它可用于执行C / C ++程序可移植性的运行时测试。但这就是该实现的实用性将要终止的地方。不要指望在“正常”的C / C ++编译器中看到类似的东西。
int
。开场白说,一切都取决于编译器,但随后提到了一些硬件约束来提高效率,请您讨论一下。
是的,它取决于两个处理器(更具体地说,是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_t
or int64_t
,而不是long
通过stdint.h。
sizeof(int)
是16的16位计算机上,但它更可能是2
long
就足够了,并且如果时间太长也不会造成问题。主要的例外是直接读取或写入磁盘或网络格式时。
short
,8位int
和16位long
。使用int32_t
代替。
long
必须能够代表所有的数字范围-2147483647到2147483648
是的,会的。他们的意思是“取决于哪个:编译器或处理器”?在那种情况下,答案基本上是“两者”。通常,它int
不会大于处理器寄存器(除非小于16位),但可能会较小(例如,在64位处理器上运行的32位编译器)。但是,通常,您需要一个64位处理器来运行带有64位int的代码。
int
。许多(大多数?)32位编译器具有64位类型,但是其名称不同(例如__int64
或long long
)。
根据最近的一些研究,我已经完成了固件访问的研究:
处理器位架构(即8位,16位,32位,64位)最重要的影响是您需要如何最有效地存储每个字节的信息,以便在最少的周期数内最佳地计算变量。
处理器的位大小告诉您CPU在一个周期内可以处理的自然字长。如果32位计算机在内存中正确对齐,则需要2个周期来处理64位double。大多数个人计算机现在还是现在都是32位的,因此C编译器对32位整数的典型亲和力以及更大的浮点数和长整型的选项是最可能的原因。
显然,您可以计算较大的变量大小,因此从某种意义上说,CPU的位体系结构决定了如何存储较大和较小的变量,以实现最佳的处理效率,但这绝不是字节大小定义的限制因素对于整数或字符,这是编译器的一部分,由约定或标准规定。
我发现该站点对http://www.geeksforgeeks.org/archives/9705非常有帮助,可以解释CPU的自然字长如何影响它将如何选择存储和处理更大或更小的变量类型,尤其是在位打包方面成结构。您必须非常了解如何选择分配变量,因为较大的变量需要在内存中对齐,因此除以CPU的字长后,它们占用的循环次数最少。如果您对变量的分配顺序不佳,则会为诸如struct之类的东西增加很多潜在的不必要的缓冲区/空空间。
数据类型的大小取决于处理器,因为编译器希望使CPU更容易访问下一个字节。例如:如果处理器为32位,则编译器可能不会选择int大小为2个字节(应该选择4个字节),因为访问该int的另外2个字节(4个字节)会占用额外的CPU周期,这很浪费。如果编译器选择int作为4字节,则CPU可以一次性完成4字节的访问,从而可以加快应用程序的速度。
谢谢
http://www.agner.org/optimize/calling_conventions.pdf
“ 3数据表示”很好地概述了编译器对整数类型的处理方式。
是的,我发现Turbo C中int的大小为2个字节,而在MSVC编译器中为4个字节。
基本上,int的大小是处理器寄存器的大小。