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

    在C和C++中,有四种不同的数据类型可用于保存整数,即short,int,long和long 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 = 864位gcc编译器中输出:
Size of int = 4
Size of long = 8
Size of long long = 8

    请参阅本文,以了解有关如何使用32位或64位gcc编译器编译程序的详细信息。
    从上面我们可以得出结论,只有“long”数据类型的大小因编译器而异。 现在的问题是,这里到底发生了什么? 让我们结合编译器内部分配内存的方式进行讨论。
    CPU通过将位置的地址提供给MAR(内存地址寄存器),从RAM中调用数据。找到该位置并将数据传输到MDR(存储器数据寄存器)。这些数据被记录在处理器中的一个寄存器中,以便进一步处理。因此,数据总线的大小决定了处理器中寄存器的大小。现在,一个32位寄存器一次只能调用4个字节大小的数据。而且,如果数据大小超过32位,则需要两个读取周期才能将数据放入其中。与64位相比,这会降低32位计算机的速度,后者只需在一个获取周期内完成操作。因此,显然,对于较小的数据,如果处理器的时钟速度相同,则没有任何区别。编译器旨在为目标机器体系结构生成最有效的代码。
    因此,简而言之,变量的大小取决于编译器,因为它根据目标体系结构和系统体系结构生成指令,而系统体系结构涉及数据总线的大小及其传输。
    注意:有趣的是,我们不需要“long”数据类型,因为C99标准已经提供了它的替代品(int,long long)。
    建议:如果整数类型在所有英特尔平台上具有相同的大小对您很重要,请考虑将“long”替换为“int”或“long long”。对于上述操作系统、体系结构和编译器的组合,“int”整数类型的大小为4字节,“long long”整数类型的大小为8字节。

参考文档

[1]Shubham Bansal.Is there any need of “long” data type in C and C++?[EB/OL].https://www.geeksforgeeks.org/need-long-data-type-c-cpp/,2020-03-30.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值