长整型和整数数据类型的区别

47

考虑到以下语句返回4,在C++中intlong类型之间的区别是什么?

sizeof(int)
sizeof(long)

2
已问已答:https://dev59.com/TXVC5IYBdhLWcg3whBaj#271132 - Martin York
在16位机器上,int类型占用2个字节。而long类型仍然是4个字节。int类型过去被定义为机器可以一次处理的最大整数值。我说过去是因为在Windows 64上它仍保持为4个字节。 - rxantos
6个回答

53

根据这个参考文献:

int最初被设计为处理器的“自然”字长。许多现代处理器可以同等轻松地处理不同的字长。

此外,还有这段话:

在许多(但不是所有)C和C++实现中,long比int更大。今天最流行的桌面平台,例如Windows和Linux,主要运行在32位处理器上,大多数编译器使用与long相同大小和表示的32位int。


45

标准给你的保证如下:

1 == sizeof(char) <= sizeof(short) <= sizeof (int) <= sizeof(long) <= sizeof(long long)

因此,sizeof(int)sizeof(long)相等是完全有效的,许多平台选择采用这种方法。您会发现一些平台上,int为32位,long为64位,long long为128位,但sizeof(long)为4似乎非常普遍。

(请注意,在C99中,long long被认为是C的一部分,但在C++11之前,它通常作为C++的扩展实现。)


1
这是一条有用的信息。在某些处理器和编译器中,sizeof(char) != sizeof(short)。细节现在有点模糊了,但我相信我曾经使用过的某个处理器无法寻址少于16位。编译器必须做很多工作才能使sizeof(char) == 1。 - Craig Lewis
@CraigLewis:你的意思是“...其中sizeof(char)==sizeof(short)”,对吗? - Walter Tross
我相信一些Cray机器的sizeof(char) == sizeof(short) && sizeof(char) == sizeof(int) && sizeof(int) == 1,而且这个大小至少为32位。 - Jonathan Leffler
Cray机器,特别是Cray SV1非常有趣。它们具有8位字符。声明单个字符将占用整个64位字,并浪费一些空间。对于字符数组或结构中的多个字符,编译器会自动将8位字符打包在64位字中。char指针也比其他指针更大,它们必须存储64位字的地址以及打包字符所在的位置。 - AliciaBytes

17

您的机器是32位或者64位的Windows机器。在我的64位机器上(运行Unix衍生操作系统,不是Windows),sizeof(int) == 4,但是sizeof(long) == 8

它们是不同的类型 - 有时彼此大小相同,有时则不同。

(在很早的时候,sizeof(int) == 2sizeof(long) == 4,尽管那可能是C ++出现之前的日子。尽管如此,在嵌入式空间以外,这可能是一个不寻常的合法配置,并且在嵌入式空间中也可能不寻常。)


9
请注意,这取决于编译器和计算机。在MSVC中,即使在64位Windows上,sizeof(long) == 4。 - Steve Jessop
当然可以 - 但我没有使用64位的Windows机器。但是,我的说法“你在32位机器上”太笼统了;它可能是“你在32位机器或Windows机器上”,这将是一种学究式的准确性。 - Jonathan Leffler
8
我认为你的第一句话并不是不准确,而更像是一个合理的猜测。我担心第二句话会导致人们错误地认为你的long类型变量长度为8字节是因为你的计算机是64位的,实际上这只是编译器的一种情况性质。 - Steve Jessop
很多人使用64位Windows。这是一个非常庞大的用户群体,你给了他们错误的sizeof(long)大小,这并不是吹毛求疵。所以我支持Steve。 - Cookie
1
@Cookie:在2009年,使用64位Windows的人非常少。而现在,使用64位Windows的人非常多。 - Jonathan Leffler

4
在它们的大小相同的平台上,答案是没有区别。它们都代表有符号的4字节值。
然而,你不能依赖这个说法。long和int的大小并没有被标准明确定义。编译器可能会给这些类型不同的大小,从而打破这个假设。

3

long的长度至少与int相同,但可能会更长。

在通用的32位系统上,int和long都是4个字节/32位,这符合C++规范。

在其他系统上,int和long long的大小可能不同。我曾经在一个平台上工作,其中int为2个字节,而long为4个字节。


2

一种典型的最佳实践是不直接使用long/int/short。相反,根据编译器和操作系统的规范,将它们包装到头文件中,以确保它们恰好持有你所需要的位数。然后使用int8/int16/int32代替long/int/short。例如,在32位的Linux上,你可以定义一个像下面这样的头文件:

typedef char int8;
typedef short int16;
typedef int int32;
typedef unsigned int uint32;

5
无需定义它们,它们已经包含在一个名为<cstdint>的标准头文件中,详见此处:http://en.cppreference.com/w/cpp/types/integer。 - jogojapan
@jogojapan 是的,如果可能的话,我们应该始终优先选择标准定义。但是,如果代码需要足够的兼容性才能在一些旧的操作系统/编译器上编译,则手动编写此类内容将确保其兼容性。每个选项都有好坏之分 :) - fwlx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接