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
    2
    long long num1 = 123456789LL;
    long long num2 = 123456789ll;
  • unsigned long long - 对应类型的数值可以使用 ULL (大写) 或者 ull (小写) 或者 Ull、uLL (等大小写混合)后缀

    1
    2
    3
    4
    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 longunsigned 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
2
3
4
5
6
7
8
9
10
11
12
13
14
#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;
}

程序输出的结果:

1
2
3
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++中处理数据的时候,如果参与运算的数据或者传递的参数类型不匹配,整型间会发生隐式的转换,这种过程通常被称为整型的提升。比如如下表达式∶

1
(int)num1 + (long long)num2

关于这种整形提升的隐式转换遵循如下原则:

  • 长度越大的整型等级越高,比如 long long int 的等级会高于int
  • 长度相同的情况下,标准整型的等级高于扩展类型,比如 long long intint64 如果
都是64 位长度,则long long int类型的等级更高。

  • 相同大小的有符号类型和无符号类型的等级相同,long long intunsigned longlong 
int的等级就相同。
  • 转换过程中,低等级整型需要转换为高等级整型,有符号的需要转换为无符号整形。