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

295

我正在从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;

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

等等。


1
https://dev59.com/vmw15IYBdhLWcg3wqNqM - Matt Ball
2
@user2612743 - 为了保险起见,请考虑您的需求并使用适当的类型。long long可能比long慢,而long可能比int慢。 - Pete Becker
1
http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx - 1110101001
5
“为了安全起见,使用long long”与“为了安全起见,给每个人一个地球艾滋病,这样我们就不用担心安全性行为了,反正我们已经有它了!”是一样的荒谬。想想数据可能具有的各种值,并使用最适合的数据类型。这还有助于编译器进行额外的优化,而不会破坏原始代码意图,例如如果必须加载额外的库来处理大于目标平台自然位宽的数字。 - C. M.
在win32列表框等控件中使用long long类型很容易对内存和其他变量造成严重影响,即使没有超出限制。即使有看似无害的C4244警告,也很难检测到问题。 - Laurie Stearn
7个回答

256

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 long 也是 long long int 类型的一个限定符。

虽然 C++ 标准本身没有指定整数类型的最小范围,但它引用了 C99,位于 1.2 规范性参考资料 中。因此,C99 5.2.4.2.1 Sizes of integer types <limits.h> 中设定的最小范围是适用的。


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


9
unsignedunsigned int是相同的东西。 - Kal
6
我很确定 long 至少有32位(在零的两侧是2^31-1),而 long long 至少有64位(在零的两侧是2^63-1)。 - chris
2
long double 至少保证具有 double 的范围,但可能相同。这取决于计算机。一些浮点单元具有扩展精度;x87芯片具有32位单精度、64位双精度和80位扩展精度。 - Eric Jablow
关于范围要求,C++11标准引用了具有实际范围的C11标准。 - chris
1
@AbhishekMane:我认为long int(b)的问题可能只是因为long被视为与其余的转换int(b)不同的东西。如果您使用long(b)(long int)(b),甚至是其中之一typedef long int LI;using LI = long int;LI(b),它可以正常工作。但是,我发现很难引起大量兴趣,因为C++开发人员应该尽可能避免旧式转换。当然,如果您正在整合遗留的C代码,则可以使用(long int)b,但在C中没有<someType>(var) - paxdiablo
显示剩余4条评论

80

长整型和长整数至少为32位。

长长整型和长长整数至少为64位。您必须使用c99编译器或更高版本。

长双精度浮点数有些奇怪。详细了解请参阅维基百科。


31

long相当于long int,就像short相当于short int一样。 long int是一个有符号的整数类型,至少需要32位,而long long或者long long int是一个有符号的整数类型,至少需要64位。

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

64位数据模型的概述可以在这里找到。

long double不能保证比double更宽广,只能保证至少与double一样宽广。


2
有没有平台,使得所有 4 种整数类型:short、int、long 和 long long 的大小都不同? - Sapien2

18

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

后来,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

您可以通过包含<cstdint>头文件来使用这些int*_t类型。 size_t<stdlib.h>中。


12

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

long只是在单独使用时表示long int的缩写。

long是一种修饰符,您也可以将其与double一起使用,表示为long double

long == long int

它们都占用4个字节。


1
长整型占用4个字节只在Win64上有效,这是与平台相关的。 - Prodigle
2
当然,int类型不仅长度长...它占用4个字节,而2个字节则取决于平台,毫无疑问。 - Siraj Alam

3
历史上,在早期的C语言时代,当处理器的字长为8或16位时,int和今天的short(16位)是相同的。在某种意义上,int比charshortlonglong long更抽象,因为你无法确定比特宽度。
定义int n;可以理解为“给我这台机器上n的比特宽度和速度的最佳平衡点”。也许在未来,编译器会将int转换为64位。因此,如果您想让您的变量具有32位而不是更多,请使用显式的long作为数据类型。
[编辑:#include <stdint.h>似乎是确保使用int##_t类型的比特宽度的正确方式,尽管它还没有成为标准的一部分。]

2
最后一部分,使用“long”获取32位时,int为64位是不正确的。如果int为64位,则long将至少为64位。Long保证至少与int一样大,尽管它可能更大,但永远不会更小。大多数编译器都有各种方法,允许程序员更具体地指定,例如(非便携式)__int32类型恰好为32位等。 - C. M.
2
根据C标准的定义,long类型保证至少为32位。(标准可能会发生变化。)当前的C++14草案只是说:@C.M. “普通整数具有执行环境建议的自然大小,其他有符号整数类型则提供以满足特殊需求”(第3.9.1节)。我没有在其中找到关于各种整数长度关系的任何信息。虽然__int32并不真正属于标准,但自C++11以来,可用typedefs如int_fast32_t或int_least32_t可用于获取您想要的精确类型。 - thomiel
1
我认为在二十世纪的通用可重编程微型计算机实现中,“char”几乎一致为8位,“short”为16位,“long”为32位;“int”可以是16位或32位。请注意,对于某些平台(特别是68000),16位和32位的“int”都非常普遍,事实上,一些编译器有支持任一选项的选项。因此,需要可移植的代码应优先使用“short”或“long”。 - supercat

-1

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


3
这个答案对之前的回答有什么补充? - zkoza
这个答案很简短直接,因为回答需要。 - Mohanad Talat
不,long long int 类型的变量不是“整数”,因为只有 int 才能是“整数”。不过,long long int 类型的变量确实具有整数类型,我想这可能是你的意思。但是,long long 类型也是一样的。在 long long int 中的 int 并没有增加任何东西,只会造成混淆。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接