我正在从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;
所有这些不同的数据类型之间有什么区别,它们是否都具有相同的目的呢?
等等。
我正在从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++ 标准本身没有指定整数类型的最小范围,但它引用了 C99,位于 1.2 规范性参考资料
中。因此,C99 5.2.4.2.1 Sizes of integer types <limits.h>
中设定的最小范围是适用的。
至于 long double
,它实际上是浮点值而不是整数。与整数类型类似,它需要具有与 double
至少相同的精度,并为该类型提供值的超集(意思是至少包括这些值,不一定是更多的值)。
unsigned
和unsigned int
是相同的东西。 - Kallong
至少有32位(在零的两侧是2^31-1),而 long long
至少有64位(在零的两侧是2^63-1)。 - chrislong double
至少保证具有 double
的范围,但可能相同。这取决于计算机。一些浮点单元具有扩展精度;x87芯片具有32位单精度、64位双精度和80位扩展精度。 - Eric Jablowlong int(b)
的问题可能只是因为long
被视为与其余的转换int(b)
不同的东西。如果您使用long(b)
或(long int)(b)
,甚至是其中之一typedef long int LI;
或using LI = long int;
与LI(b)
,它可以正常工作。但是,我发现很难引起大量兴趣,因为C++开发人员应该尽可能避免旧式转换。当然,如果您正在整合遗留的C代码,则可以使用(long int)b
,但在C中没有<someType>(var)
。 - paxdiablolong
相当于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位数据模型的概述可以在这里找到。
long double
不能保证比double
更宽广,只能保证至少与double
一样宽广。
在Java中,long
始终为64位,而在C++中,取决于计算机架构和操作系统。例如,在Linux上,long
是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
您可以通过包含<cstdint>
头文件来使用这些int*_t
类型。 size_t
在<stdlib.h>
中。
这看起来很困惑,因为您将long
作为一种数据类型本身。
long
只是在单独使用时表示long int
的缩写。
long
是一种修饰符,您也可以将其与double
一起使用,表示为long double
。
long
== long int
。
它们都占用4个字节。
int
和今天的short
(16位)是相同的。在某种意义上,int比char
、short
、long
或long long
更抽象,因为你无法确定比特宽度。int n;
可以理解为“给我这台机器上n的比特宽度和速度的最佳平衡点”。也许在未来,编译器会将int
转换为64位。因此,如果您想让您的变量具有32位而不是更多,请使用显式的long
作为数据类型。#include <stdint.h>
似乎是确保使用int##_t类型的比特宽度的正确方式,尽管它还没有成为标准的一部分。]long
类型保证至少为32位。(标准可能会发生变化。)当前的C++14草案只是说:@C.M. “普通整数具有执行环境建议的自然大小,其他有符号整数类型则提供以满足特殊需求”(第3.9.1节)。我没有在其中找到关于各种整数长度关系的任何信息。虽然__int32并不真正属于标准,但自C++11以来,可用typedefs如int_fast32_t或int_least32_t可用于获取您想要的精确类型。 - thomiel没有区别,(long long x) 等同于 (long long int x),但是第二个确认变量 x 是整数。
long long int
类型的变量不是“整数”,因为只有 int
才能是“整数”。不过,long long int
类型的变量确实具有整数类型,我想这可能是你的意思。但是,long long
类型也是一样的。在 long long int
中的 int
并没有增加任何东西,只会造成混淆。 - undefined
long long
可能比long
慢,而long
可能比int
慢。 - Pete Becker