我正在从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;
等等。
所有这些不同的数据类型之间有什么区别,它们都有相同的目的吗?
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
一样多的精度,并提供超过该类型的值的超集(至少意味着那些值,不一定是更多的值)。
long和long int至少为32位。
long long和long long int至少为64位。您必须使用c99编译器或更好。
long
相当于long int
,正如short
相当于short int
。 long int
是有符号整数类型,至少为32位,而long long
或long long int
是有符号整数类型,至少为64位。
这并不一定意味着long long
比long
更宽。许多平台/ ABI使用LP64
模型 - 其中long
(和指针)是64位宽。 Win64使用LLP64
,其中long
仍为32位,long long
(和指针)为64位宽。
有一个64位数据模型here的很好的总结。
long double
不保证除了它至少与double
一样宽。
这看起来令人困惑,因为您将long
作为数据类型本身。
long
只是long int
的简写,当你单独使用它时。
long
是一个修饰符,你可以将它与double
一起用作long double
。
long
== long int
。
它们都占用4个字节。
从历史上看,在早期的C时代,当处理器具有8或16位字长时,int
与今天的short
(16位)相同。从某种意义上说,int是比char
,short
,long
orlong long
更抽象的数据类型,因为你无法确定位宽。
当定义int n;
you可以翻译这个“给我这个机器上的位宽和速度的最佳折衷n”。也许在未来你应该期望编译器翻译int
to是64位。因此,当您希望变量具有32位而不是更多时,最好使用explicitlong
as数据类型。
[编辑:#include <stdint.h>
似乎是使用int ## _ t类型确保位宽的正确方法,尽管它还不是标准的一部分。