我正在从Java过渡到c++,对长数据类型有一些问题。在Java中,要保存大于232的整数,只需编写长x;。然而,在c++中,long似乎既是一种数据类型,也是一个修饰符。

long似乎有几种用法:

long x;
long long x;
long int x;
long long int x;

此外,似乎还有这样的事情:

long double x;

等等。

所有这些不同的数据类型之间的区别是什么,它们都有相同的目的吗?


当前回答

Long等价于Long int,就像short等价于short int。long int是至少32位的有符号整型,而long long或long long int是至少64位的有符号整型。

这并不一定意味着long long比long宽。许多平台/ abi使用LP64模型——其中长(和指针)为64位宽。Win64使用LLP64,其中long仍然是32位,long long(和指针)是64位宽。

这里对64位数据模型进行了很好的总结。

长双精度线并不能保证它至少和双精度线一样宽。

其他回答

从历史上看,在早期的C语言时代,当处理器有8或16位的字长时,intx与今天的短(16位)相同。在某种意义上,int是一种比char (short,longorlong)更抽象的数据类型,因为你不能确定位宽。

当定义int n时,你可以用“给我这台机器上n的位宽和速度的最佳妥协”来翻译它。也许在未来你应该期望编译器翻译成64位。所以当你想要你的变量是32位而不是更多的时候,最好使用显式的longas数据类型。

[编辑:#include <stdint.h>似乎是使用int##_t类型确保位宽的正确方法,尽管它还不是标准的一部分。]

Long等价于Long int,就像short等价于short int。long int是至少32位的有符号整型,而long long或long long int是至少64位的有符号整型。

这并不一定意味着long long比long宽。许多平台/ abi使用LP64模型——其中长(和指针)为64位宽。Win64使用LLP64,其中long仍然是32位,long long(和指针)是64位宽。

这里对64位数据模型进行了很好的总结。

长双精度线并不能保证它至少和双精度线一样宽。

这看起来令人困惑,因为作为数据类型本身,您要花费很长时间。

Long只不过是Long int单独使用时的简写。

Long是修饰语,也可以和Long double连用。

Long == Long int。

它们都占用4个字节。

Long和Long int至少是32位。

Long Long和Long Long int至少是64位。你必须使用c99或更好的编译器。

长双头有点奇怪。详情请查阅维基百科。

没有区别,(long long x)等价于(long long int x),但第二个确认变量x是整数