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


209

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

等等。

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



2
@ user2612743-为了安全起见,请考虑您的要求并使用适当的类型。long long可能比慢long,可能比慢int
Pete Becker 2013年


1
不,“要安全,要长期使用”与说“要安全,只给每个人一个地球艾滋病,所以我们不必担心安全性行为,反正我们都已经做到了!” 傻了,不是吗?考虑数据及其可能的值,然后使用最合适的类型。这还可以帮助编译器进行其他优化,而又不会破坏原始代码的意图,例如,如果它必须加载其他库来处理大于目标平台自然位宽的数字,则可以避免这种情况。
2015年

与win32列表框等一起使用long long不会破坏您的内存和其他变量,即使没有违反限制。即使看上去无害的C4244警告,也不容易发现。
Laurie Stearn

Answers:


182

long并且long 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。在此列表中,每种类型至少提供与列表中位于其前面的类型相同的存储量。

中的表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

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

因此,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,实际上是一个浮点值,而不是整数。与整数类型相似,它要求至少具有double和a一样高的精度,并提供该类型上的值的超集(意味着至少这些值,不一定是更多的值)。


4
unsignedunsigned int
Kal

2
我很确定long至少是32位(在零的任一侧为2 ^ 31-1),并且long long至少是64 位(在任一侧为2 ^ 63-1)。
克里斯

2
并且long double保证至少具有的范围double,但可能相同。这取决于计算机。一些FPU具有更高的精度;x87芯片具有32位单精度,64位双精度和80位扩展精度。
Eric Jablow 2013年

至于范围要求,C ++ 11标准引用了具有实际范围的C11标准。
克里斯

“ int”部分仅区分整数类型和浮点数,字符或其他非整数类型。在许多情况下,编译器可以推断出这一点,因此可以将其删除-例如,这就是为什么“ unsigned”与“ unsigned int”相同的原因。除非程序员指定其他内容,例如“ char”或“ double”,否则仅假定“ int”部分。至于实际使用的大小,根据读取的标准,每个大小可能具有最小位数,但是它们的定义都使得每个大小至少与以前的类型一样大。
CM


17

long等同于long intshort等同于short int。A long int至少 32位的有符号整数类型,而a long long或是至少 64位的long long int有符号整数类型。

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

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

long double除了宽度至少与一样大,我不能保证double


7

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

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

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

long== long int

它们都占用4个字节。


占用4个字节的长字节仅在Win64上有效,它取决于平台
Prodigle

1
是的,显然……不仅长……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
最后一部分在int为64位时使用“ long”获得32位是不正确的。如果int是64位,则long 至少也将是64位。长整数(Long)可以保证至少与int一样大,尽管它可以更大,但决不能更小。大多数编译器都有各种使程序员更加具体的方法,例如正好是3​​2位的(非便携式)__ int32类型,依此类推。
CM

1
如C标准中所定义,long保证a 至少为 32位。(标准可能会改变。)当前的C ++ 14草案只是说:@CM“普通整数具有执行环境的体系结构建议的自然大小,还提供了其他有符号整数类型以满足特殊需要”(第3.9.1节) )。我没有发现其中各种整数的长度关系。__int32并不是该标准的真正组成部分,但是自C ++ 11起,就可以使用诸如int_fast32_t或int_least32_t之类的typedef来获得所需的确切信息。
thomiel

我要说的是,在20世纪,通用可重编程微型计算机的实现char几乎一致地是8位,分别short是16 位和long32位。int可以是16或32。请注意,对于某些平台(尤其是68000),16位和32位int都很常见,确实有些编译器可以选择支持这两种。因此,预期需要使用可移植的代码shortlong优先使用int
超级猫

0

在Java中,a 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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.