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

long似乎有几种用法:

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

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

long double x;

等等。

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


当前回答

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

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

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

其他回答

在Java中,long总是64位,而在c++中,这取决于计算机体系结构和操作系统。例如,long在Linux上是64位,在Windows上是32位(这样做是为了保持向后兼容性,允许32位程序在64位Windows上编译而不做任何更改)。Long int是Long的同义词。

后来,long long被引入,意思是“长(64位)在Windows上是真的”。Long Long int是这个的同义词。

它被认为是很好的c++风格,避免短,整型,长等,而是使用:

std::int8_t   # exactly  8 bits
std::int16_t  # exactly 16 bits
std::int32_t  # exactly 32 bits
std::int64_t  # exactly 64 bits

std::size_t   # can hold all possible object sizes, used for indexing

你可以通过包含<cstdint>头来使用这些int*_t类型。Size_t在<stdlib.h>中。

从历史上看,在早期的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至少是32位。

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

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

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

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

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

Long == Long int。

它们都占用4个字节。