C++中"long","long long","long int"和"long long int"有什么区别?

111*_*001 176 c++ long-integer

我正在从Java过渡到C++,并对long数据类型有一些疑问.在Java中,要保存大于2 32的整数,您只需编写long x;.但是,在C++中,它似乎long既是数据类型又是修饰符.

似乎有几种使用方法long:

long x;
long long x;
long int x;
long long int x;
Run Code Online (Sandbox Code Playgroud)

此外,似乎有一些事情,如:

long double x;
Run Code Online (Sandbox Code Playgroud)

等等.

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

pax*_*blo 161

long并且long int完全相同.所以是long longlong long int.在这两种情况下,int都是可选的.

至于两组之间的差异,C++的每个标准的任务的最小范围,并且long long是在至少一样宽long.

标准的控制部分(C++ 11,但这已经存在了很长时间),对于一个3.9.1 Fundamental types,第2节(后面的部分给出了无符号整数类型的类似规则):

有五种标准的有符号整数类型:signed char,short int,int,long int和long long int.在此列表中,每种类型至少提供与列表中前面的存储一样多的存储空间.

还有一个表9 7.1.6.2 Simple type specifiers,它显示了说明符与实际类型的"映射"(显示它int是可选的),其中一部分如下所示:

Specifier(s)         Type
-------------    -------------
long long int    long long int
long long        long long int
long int         long int
long             long int
Run Code Online (Sandbox Code Playgroud)

请注意说明符和类型之间的区别.说明符是如何告诉编译器类型是什么,但您可以使用不同的说明符以相同的类型结束.

因此,long就你自己的问题而言,它既不是一个类型也不是一个修饰符,它只是一个long int类型的说明符.同上long long作为该long long int类型的说明符.

虽然C++标准本身没有指定整数类型的最小范围,但它确实引用了C99 1.2 Normative references,作为应用.因此,所述的最小范围C99 5.2.4.2.1 Sizes of integer types <limits.h>是适用的.


就其而言long double,这实际上是浮点值而不是整数.与整数类型类似,它必须具有至少与a一样多的精度,double并提供超过该类型的值的超集(至少意味着那些值,不一定是更多的值).

  • 与unsigned和unsigned int相同 (4认同)
  • 我很确定`long`至少是32位(零两边是2 ^ 31-1)而`long long`至少是64(两边都是2 ^ 63-1). (2认同)
  • 而`long double`保证至少有`double`的范围,但也可能是一样的。这取决于计算机。一些 FPU 具有扩展精度;x87 芯片具有 32 位单精度、64 位双精度和 80 位扩展精度。 (2认同)

Eri*_*ert 55

long和long int至少为32位.

long long和long long int至少为64位.您必须使用c99编译器或更好.

长双打有点奇怪.有关详细信息,请在维基百科上查找.


xjc*_*jcl 23

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

后来,long long它被引入表示“这次在 Windows 上真正的长(64 位)”。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
Run Code Online (Sandbox Code Playgroud)

int*_t您可以通过包含标头来使用这些类型<cstdint>size_t是在<stdlib.h>.


Bre*_*ale 16

long相当于long int,short等同于short int.A long int是有符号整数类型,至少为 32位,而a long longlong long int有符号整数类型至少为 64位.

这并不一定意味着a long long比a宽long.许多平台/ ABI使用该LP64模型 - 其中long(和指针)是64位宽.Win64使用LLP64,其中long仍为32位,long long(和指针)为64位宽.

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

long double不保证除了它至少与a一样宽double.

  • 是否存在所有 4 种整数类型:short、int、long 和 long long 具有不同大小的平台? (2认同)

Sir*_*lam 7

这看起来令人困惑,因为您将long自己作为数据类型.

long只不过是long int你单独使用时的简写.

long是一个修改,你可以用它double也可以作为long double.

long== long int.

它们都占用4个字节.

  • Long take 4 bytes 仅在 Win64 上有效,它与平台相关 (2认同)
  • 是的,显然......不仅长......int需要4个字节,2个字节取决于平台,毫无疑问。 (2认同)