我正在从 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;
等等。
所有这些不同的数据类型有什么区别,它们的目的是否相同?
我正在从 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;
等等。
所有这些不同的数据类型有什么区别,它们的目的是否相同?
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。在此列表中,每种类型提供的存储空间至少与列表中它前面的类型一样多。
中还有一个表 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,in 1.2 Normative references
,作为应用。C99 5.2.4.2.1 Sizes of integer types <limits.h>
因此,适用于中所列的最小范围。
就 而言long double
,这实际上是一个浮点值而不是整数。与整数类型类似,它需要至少具有与 a 一样高的精度,double
并提供该类型的值的超集(意味着至少那些值,不一定是更多值)。
Long 和 long int 至少为 32 位。
long long 和 long long int 至少为 64 位。您必须使用 c99 或更好的编译器。
长双打有点奇怪。在 Wikipedia 上查找它们以获取详细信息。
long
等价于long int
,正如short
等价于short int
。Along int
是至少32 位的有符号整数类型,而 a long long
orlong long int
是有符号整数类型至少是64 位。
这并不一定意味着 along long
比 a 宽long
。许多平台/ABI 使用该LP64
模型——其中long
(和指针)为 64 位宽。Win64 使用LLP64
, 其中long
仍然是 32 位,并且long long
(和指针)是 64 位宽。
这里有 64 位数据模型的一个很好的总结。
long double
除了至少与double
.
这看起来令人困惑,因为您将long
其本身作为数据类型。
long
只是long int
当你单独使用它时的简写。
long
是修饰符,您也可以将其与double
as一起使用long double
。
long
== long int
。
它们都占用 4 个字节。
虽然在 Java 中 along
始终是 64 位,但在 C++ 中,这取决于计算机体系结构和操作系统。例如,along
在 Linux 上是 64 位,在 Windows 上是 32 位(这样做是为了保持向后兼容性,允许 32 位程序在 64 位 Windows 上编译而无需任何更改)。long int
是 的同义词long
。
后来,long long
它被引入意味着“这次在 Windows 上真正的长(64 位)”。long long int
是这个的同义词。
避免,等被认为是良好的 C++ 风格,而是使用: short
int
long
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>
从历史上看,在早期的 C 时代,当处理器具有 8 或 16 位字长时,int
与今天short
(16 位)相同。在某种意义上, int 是一种比char
, short
, long
or更抽象的数据类型long long
,因为您无法确定位宽。
在定义时int n;
,您可以将其翻译为“在这台机器上为 n 提供位宽和速度的最佳折衷方案”。也许将来您应该期望编译器转换int
为 64 位。因此,当您希望变量具有 32 位而不是更多时,最好使用显式long
作为数据类型。
[编辑:#include <stdint.h>
似乎是使用 int##_t 类型确保位宽的正确方法,尽管它还不是标准的一部分。]
没有定义, (long long x ) 等价于 (long long int x ),但第二个确认变量 x 是整数