相比于C++98标准,C++11整型的最大改变就是多了long long。但事实上,long long 整型本来就离C++标准很近,早在1995年,long long 就被提议写入 C++98标准,却被C++标准委员会拒绝了。而后来,long long类型却进入了C99标准,而且也事实上也被很多编译器支持。于是辗转地,C++标准委员会又掉头决定将 long long纳入 C++11标准。
1. long long 类型
C++11 标准要求 long long 整型可以在不同平台上有不同的长度,但至少有64位。long long 整型有两种∶
- long long - 对应类型的数值可以使用 LL (大写) 或者 ll (小写) 后缀
long long num1 = 123456789LL;
long long num2 = 123456789ll;
- unsigned long long - 对应类型的数值可以使用 ULL (大写) 或者 ull (小写) 或者 Ull、uLL (等大小写混合)后缀
unsigned long long num1 = 123456789ULL;
unsigned long long num2 = 123456789ull;
unsigned long long num3 = 123456789uLL;
unsigned long long num4 = 123456789Ull;
事实上在C++11中还有一些类型与以上两种类型是等价的:
对于有符号类型的 long long和以下三种类型等价
- long long int
- signed long long
- signed long long int
对于无符号类型的unsigned long long 和unsigned long long int是等价的
同其他的整型一样,要了解平台上 long long大小的方法就是查看<climits>(或<limits. h> )中的宏与long long整 型相关的一共有3个:
- LLONG_MIN - 最小的long long值
- LLONG_MAX - 最大的long long 值
- ULLONG MAX - 最大的 unsigned long long 值
测试代码如下:
#include <iostream>
using namespace std;
int main()
{
long long max = LLONG_MAX;
long long min = LLONG_MIN;
unsigned long long ullMax = ULLONG_MAX;
cout << "Max Long Long value: " << max << endl
<< "Min Long Long value: " << min << endl
<< "Max unsigned Long Long value: " << ullMax << endl;
return 0;
}
程序输出的结果:
Max Long Long value: 9223372036854775807
Min Long Long value: -9223372036854775808
Max unsigned Long Long value: 18446744073709551615
可以看到 long long 类型能够存储的最大/最小值还是非常大/小的,但是这个值根据平台不同会有所变化,原因是因为C++11标准规定该类型至少占8字节,它占的字节数越多,对应能够存储的数值也就越大。
2. 扩展的整形
在C++11中一共只定义了以下5种标准的有符号整型:
- signed char
- short int
- int
- long int
- long long int
标准同时规定,每一种有符号整型都有一种对应的无符号整数版本,且有符号整型与其对应的无符号整型具有相同的存储空间大小。比如与 signed int对应的无符号版本的整型是 unsigned int。
当我们在C++中处理数据的时候,如果参与运算的数据或者传递的参数类型不匹配,整型间会发生隐式的转换,这种过程通常被称为整型的提升。比如如下表达式∶
(int)num1 + (long long)num2
关于这种整形提升的隐式转换遵循如下原则:
- 长度越大的整型等级越高,比如 long long int 的等级会高于int。
- 长度相同的情况下,标准整型的等级高于扩展类型,比如 long long int 和 int64 如果 都是64 位长度,则long long int类型的等级更高。
- 相同大小的有符号类型和无符号类型的等级相同,long long int 和unsigned longlong int的等级就相同。
- 转换过程中,低等级整型需要转换为高等级整型,有符号的需要转换为无符号整形。