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

时间:2013-09-24 01:49:19

标签: 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;

此外,似乎还有以下内容:

long double x;

等等。

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

7 个答案:

答案 0 :(得分:146)

longlong 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。在此列表中,每种类型至少提供与列表中前面的存储一样多的存储空间。

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 longlong long int类型的说明符。

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


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

答案 1 :(得分:50)

long和long int至少为32位。

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

长双打有点奇怪。 Look them up on Wikipedia for details.

答案 2 :(得分:13)

long相当于long int,就像short相当于short int一样。 long int是有符号整数类型,至少 32位,而long longlong long int是有符号整数类型至少< / em> 64位。

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

对64位数据模型here进行了总结。

除了{em>至少
long double一样宽,

double并不能保证很多。

答案 3 :(得分:7)

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

long只是long int单独使用时的简写。

long是一个修饰符,您可以将其与double一起用作long double

long == long int

它们都占用4个字节。

答案 4 :(得分:3)

历史上,在早期的C时代,当处理器有8或16位字长时,int与今天的short(16位)相同。在某种意义上,int是比charshortlonglong long更抽象的数据类型,因为您无法确定位宽。

定义int n;时,您可以使用&#34进行翻译;在本机上为n&#34;提供最佳的位宽和速度折衷。也许在将来你应该期望编译器将int翻译为64位。因此,当您希望变量具有32位而不是更多时,最好使用显式long作为数据类型。

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

答案 5 :(得分:2)

在Java中,long始终为64位,而在C ++中,此取决于计算机体系结构和操作系统。例如,long在Linux上是64位,在Windows上是32位(这样做是为了保持向后兼容,从而允许32位程序在64位Windows上进行编译而没有任何更改)。

避免 short int long ...被认为是很好的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

可以在包含int*_t标头之后使用这些(<cstdint>)。 size_t<stdlib.h>中。

答案 6 :(得分:0)

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