long long 整形
long long 整形
苏丙榅相比于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 (小写) 后缀
1
2long long num1 = 123456789LL;
long long num2 = 123456789ll;unsigned long long - 对应类型的数值可以使用 ULL (大写) 或者 ull (小写) 或者 Ull、uLL (等大小写混合)后缀
1
2
3
4unsigned 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 值
测试代码如下:
1 |
|
程序输出的结果:
1 | Max Long Long value: 9223372036854775807 |
可以看到 long long 类型能够存储的最大/最小值还是非常大/小的,但是这个值根据平台不同会有所变化,原因是因为C++11标准规定该类型至少占8字节,它占的字节数越多,对应能够存储的数值也就越大。
2. 扩展的整形
在C++11中一共只定义了以下5种标准的有符号整型:
signed char
short int
int
long int
long long int
标准同时规定,每一种有符号整型都有一种对应的无符号整数版本,且有符号整型与其对应的无符号整型具有相同的存储空间大小。比如与 signed int对应的无符号版本的整型是 unsigned int。
当我们在C++中处理数据的时候,如果参与运算的数据或者传递的参数类型不匹配,整型间会发生隐式的转换,这种过程通常被称为整型的提升。比如如下表达式∶
1 | (int)num1 + (long long)num2 |
关于这种整形提升的隐式转换遵循如下原则:
- 长度越大的整型等级越高,比如
long long int
的等级会高于int
。 - 长度相同的情况下,标准整型的等级高于扩展类型,比如
long long int
和int64
如果 都是64 位长度,则long long int
类型的等级更高。 - 相同大小的有符号类型和无符号类型的等级相同,
long long int
和unsigned longlong int
的等级就相同。 - 转换过程中,低等级整型需要转换为高等级整型,有符号的需要转换为无符号整形。