1. 主页
  2. 文档
  3. C语言教程
  4. C语言数据类型
  5. C 和 C++ 中是否需要“long”数据类型?

C 和 C++ 中是否需要“long”数据类型?

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

  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 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 编译器中输出:-
Size of int = 4
Size of long = 4
Size of long long = 8
在 64 位 gcc 编译器中输出:- 
Size of int = 4
Size of long = 8
Size of long long = 8

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

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

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

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

这篇文章对您有用吗?