在里面 C 和 C++ ,有四种不同的数据类型可用于保存整数,即:。, 短,内,长 和 好久好久 .每种数据类型都需要不同的内存量。 但有一个陷阱,就是 “长” 与其他数据类型不同,数据类型不是固定的。它因体系结构、操作系统甚至我们使用的编译器而异。在一些系统中,它的行为就像 智力 数据类型或 好久好久 数据类型如下:
OS Architecture Size Windows IA-32 4 bytes Windows Intel® 64 or IA-64 4 bytes Linux IA-32 4 bytes Linux Intel® 64 or IA-64 8 bytes Mac OS X IA-32 4 bytes Mac OS X Intel® 64 or IA-64 8 bytes
它也因编译器而异。但在此之前,让我们先了解一下 交叉编译器 . 交叉编译器是一种能够为运行编译器的平台以外的平台创建可执行代码的编译器。 例如,如果我在运行64位Ubuntu的64位体系结构中编译以下程序,我将得到如下结果:
C++
// C++ program to check the size of 'long' // data type #include <bits/stdc++.h> using namespace std; int main() { cout << "Size of int = " << sizeof ( int ) << endl; cout << "Size of long = " << sizeof ( long ) << endl; cout << "Size of long long = " << sizeof ( long long ); } // This code is contributed by shubhamsingh10 |
C
// C program to check the size of 'long' // data type #include<stdio.h> int main() { printf ( "Size of int = %ld" , sizeof ( int )); printf ( "Size of long = %ld" , sizeof ( long )); printf ( "Size of long long = %ld" , sizeof ( long long )); } |
Output in 32 bit gcc compiler:- Size of int = 4 Size of long = 4 Size of long long = 8 Output in 64 bit gcc compiler:- Size of int = 4 Size of long = 8 Size of long long = 8
看见 这 本文将详细介绍如何使用32位或64位gcc编译器编译程序。
从上面我们可以得出结论,只有“长”数据类型的大小因编译器而异。现在的问题是这里到底发生了什么?让我们以编译器如何在内部分配内存的方式来讨论它。
CPU通过向MAR(内存地址寄存器)提供位置地址,从RAM调用数据。找到位置并将数据传输到MDR(内存数据寄存器)。这些数据被记录在处理器的一个寄存器中,以便进一步处理。这就是为什么数据总线的大小决定了处理器中寄存器的大小。现在,32位寄存器一次只能调用4字节大小的数据。如果数据大小超过32位,则需要两次获取周期才能将数据放入其中。这降低了32位机器的速度,而64位机器只需在一个提取周期内完成操作。因此,显然对于较小的数据,如果我的处理器以相同的速度运行,这没有什么区别。编译器旨在为目标机器体系结构生成最高效的代码。
因此,简而言之,变量的大小取决于编译器,因为它根据目标体系结构和系统体系结构生成指令,而系统体系结构只处理数据总线的大小及其传输。 笔记 :有趣的是,我们不需要“long”数据类型,因为它们的替代品(int,long-long)已经从 C99 标准
建议 如果对于所有英特尔平台上的整数类型都具有相同的大小,则考虑替换。 “长” 或者 “int” 或 “好久好久” 。对于上述所有操作系统、体系结构和编译器组合,“int”整数类型的大小为4字节,“long-long”整数类型的大小为8字节。
参考资料: https://software.intel.com/en-us/articles/size-of-long-integer-type-on-different-architecture-and-os
本文由 Shubham Bansal .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。