我正在从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;
等等。
所有这些不同数据类型之间有什么区别,它们都有相同的用途吗?
答案 0 :(得分:146)
long
和long int
完全相同。 long long
和long 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 ++标准本身没有指定整数类型的最小范围,但它确实引用了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编译器或更好。
答案 2 :(得分:13)
long
相当于long int
,就像short
相当于short int
一样。 long int
是有符号整数类型,至少 32位,而long long
或long long int
是有符号整数类型至少< / em> 64位。
这并不一定意味着long long
比long
宽。许多平台/ 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是比char
,short
,long
或long 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是整数