我正在从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是相同的。所以是long long和long long int。在这两种情况下,int都是可选的。

至于这两个集合之间的区别,c++标准规定了每个集合的最小范围,long long至少和long一样宽。

标准的控制部分(c++ 11,但这已经存在很长时间了)是3.9.1基本类型,第2节(后面的一节给出了无符号整型的类似规则):

有五种标准的有符号整型:有符号char、short int、int、long int和long long int。在此列表中,每种类型提供的存储空间至少与列表中前面的类型相同。

在7.1.6.2简单类型说明符中还有一个表9,它显示了说明符到实际类型的“映射”(表明int是可选的),其中一部分如下所示:

Specifier(s)         Type
-------------    -------------
long long int    long long int
long long        long long int
long int         long int
long             long int

注意说明符和类型之间的区别。说明符是你告诉编译器该类型是什么,但是你可以使用不同的说明符来得到相同的类型。

因此long本身既不是你的问题所假设的类型,也不是修饰符,它只是long int类型的说明符。long long同样是long long int类型的说明符。

尽管c++标准本身并没有指定整型的最小范围,但它确实引用了1.2规范性参考文献中的C99作为应用。因此,适用C99 5.2.4.2.1中规定的最小范围,整数类型的大小<limits.h>。


对于长double,它实际上是一个浮点值而不是整数。与整型类似,它要求具有至少与double类型相同的精度,并提供该类型的超集(意味着至少是这些值,而不一定是更多值)。


Long和Long int至少是32位。

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

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


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单独使用时的简写。

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

Long == Long int。

它们都占用4个字节。


在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>中。


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