C和C ++中是否需要“长”数据类型?-IDC帮帮忙

在C和C++中,有四种不同的数据类型可用于保存整数,即short,int,longlong long。这些数据类型中的每一种都需要不同的内存量。
但是有一个问题,“长”数据类型的大小与其他数据类型不同。它不同于架构,操作系统甚至是我们正在使用的编译器。在某些系统中,它的行为类似于int数据类型或long long数据类型,如下所示:

  OS               体系结构          大小
Windows IA-32 4个字节
Windows英特尔®64或IA-64 4字节
Linux IA-32 4个字节
Linux英特尔®64或IA-64 8字节
Mac OS X IA-32 4个字节
Mac OSXIntel®64或IA-64 8字节 

那么它也不同于编译器。但在此之前,让我们了解交叉编译器的概念。
交叉编译器是一种编译器,能够为运行编译器的平台之外的平台创建可执行代码。
例如,如果我在运行64位Ubuntu的64位架构中编译以下程序,我将得到如下结果:

// C program to check the size of 'long'
//  data type
#include<stdio.h>
int main()
{
    printf("Size of int = %ld\n", sizeof(int));
    printf("Size of long = %ld\n", sizeof(long));
    printf("Size of long long = %ld", sizeof(long long));
}

32位gcc编译器输出: - 
int的大小= 4
长度= 4
长长的大小= 8

64位gcc编译器输出: - 
int的大小= 4
长度= 8
长长的大小= 8

请参阅此文章以了解有关如何使用32位或64位gcc编译器编译程序的更多信息。

从上面我们得出结论,只有“长”数据类型的大小因编译器而异。现在的问题是这里到底发生了什么?让我们以编译器如何在内部分配内存的方式来讨论它。

CPU通过将位置地址提供给MAR(存储器地址寄存器)来从RAM调用数据。找到该位置并将数据传输到MDR(存储器数据寄存器)。该数据记录在处理器中的一个寄存器中以供进一步处理。这就是数据总线大小决定处理器中寄存器大小的原因。现在,32位寄存器一次只能调用4字节大小的数据。如果数据大小超过32位,那么需要两个周期的提取来获取数据。与64位相比,这会降低32位机器的速度,这将仅在一个取指周期内完成操作。因此,显然对于较小的数据,如果我的处理器以相同的速度计时,则没有区别。编译器旨在为目标机器架构生成最有效的代码。

因此,简而言之,变量的大小取决于编译器,因为它根据目标体系结构和系统体系结构生成指令,这些体系结构仅处理数据总线的大小及其传输。
注意:有趣的是,我们不需要“长”数据类型,因为它们的替代品(int,long long)已经可以从C99标准获得。

建议:如果对于整数类型在所有Intel平台上具有相同大小的重要性,请考虑将“long”替换为“int”“long long”。对于所有上述操作系统,体系结构和编译器组合,“int”整数类型的大小为4个字节,“long long”整数类型的大小为8个字节。