“long”、“long long”、“long int”和“long long int”的区别是什么?在c++中?

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

似乎有几种方法可以使用long:

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

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

long double x;

等等。

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

488447 次浏览

longlong int是相同的。long longlong long int也是。在这两种情况下,int都是可选的。

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

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

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

7.1.6.2 Simple type specifiers中还有一个表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 Normative references中的C99作为应用。因此,C99 5.2.4.2.1 Sizes of integer types <limits.h>中规定的最小范围是适用的。


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

Long和Long int至少是32位。

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

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

long相当于long int,就像short相当于short int一样。long int是一个32位的有符号整型,而long longlong long int是一个64位的有符号整型。

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

这里有一个64位数据模型在这里的很好的总结。

long double不能保证太多,只能保证至少double一样宽。

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

当定义__abc0时,你可以用“给我这台机器上n的位宽和速度的最佳妥协”来翻译它。也许将来你应该期望编译器将__abc1转换为64位。因此,当你希望你的变量有32位而不是更多,最好使用显式__abc2as数据类型。

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

这看起来令人困惑,因为您将long本身作为数据类型。

当你单独使用long时,它只是long int的缩写。

long是一个修饰符,你可以将它与double一起使用,也可以作为long double

__abc0 == __abc1。

它们都占用4个字节。

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

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

它是很好的c++风格避免 shortintlong等,而不是使用:

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是整数