我正在从 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 longorlong 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是修饰符,您也可以将其与doubleas一起使用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++ 风格,而是使用: 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>
从历史上看,在早期的 C 时代,当处理器具有 8 或 16 位字长时,int与今天short(16 位)相同。在某种意义上, int 是一种比char, short, longor更抽象的数据类型long long,因为您无法确定位宽。
在定义时int n;,您可以将其翻译为“在这台机器上为 n 提供位宽和速度的最佳折衷方案”。也许将来您应该期望编译器转换int为 64 位。因此,当您希望变量具有 32 位而不是更多时,最好使用显式long作为数据类型。
[编辑:#include <stdint.h>似乎是使用 int##_t 类型确保位宽的正确方法,尽管它还不是标准的一部分。]
没有定义, (long long x ) 等价于 (long long int x ),但第二个确认变量 x 是整数