259

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

等等。

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

4

7 回答 7

230

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并提供该类型的值的超集(意味着至少那些值,不一定是更多值)。

于 2013-09-24T01:53:06.850 回答
69

Long 和 long int 至少为 32 位。

long long 和 long long int 至少为 64 位。您必须使用 c99 或更好的编译器。

长双打有点奇怪。在 Wikipedia 上查找它们以获取详细信息。

于 2013-09-24T01:57:44.500 回答
26

long等价于long int,正如short等价于short int。Along int至少32 位的有符号整数类型,而 a long longorlong long int是有符号整数类型至少是64 位。

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

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

long double除了至少double.

于 2013-09-24T02:00:03.673 回答
13

这看起来令人困惑,因为您将long其本身作为数据类型。

long只是long int当你单独使用它时的简写。

long是修饰符,您也可以将其与doubleas一起使用long double

long== long int

它们都占用 4 个字节。

于 2016-06-01T08:30:48.543 回答
5

虽然在 Java 中 along始终是 64 位,但在 C++ 中,这取决于计算机体系结构和操作系统。例如,along在 Linux 上是 64 位,在 Windows 上是 32 位(这样做是为了保持向后兼容性,允许 32 位程序在 64 位 Windows 上编译而无需任何更改)。long int是 的同义词long

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

您可以通过包含标题来使用这些int*_t类型。在.<cstdint>size_t<stdlib.h>

于 2020-06-01T12:39:57.010 回答
3

从历史上看,在早期的 C 时代,当处理器具有 8 或 16 位字长时,int与今天short(16 位)相同。在某种意义上, int 是一种比char, short, longor更抽象的数据类型long long,因为您无法确定位宽。

在定义时int n;,您可以将其翻译为“在这台机器上为 n 提供位宽和速度的最佳折衷方案”。也许将来您应该期望编译器转换int为 64 位。因此,当您希望变量具有 32 位而不是更多时,最好使用显式long作为数据类型。

[编辑:#include <stdint.h>似乎是使用 int##_t 类型确保位宽的正确方法,尽管它还不是标准的一部分。]

于 2014-08-13T11:23:24.893 回答
0

没有定义, (long long x ) 等价于 (long long int x ),但第二个确认变量 x 是整数

于 2021-03-23T23:51:18.690 回答