本文介绍 C++11 标准中新添加的 long long 超长整型和 nullptr 初始化空指针。
1. C++11:long long 超长整型
C++ 11 标准中,基于整数大小的考虑,共提供了如下表所示的这些数据类型。与此同时,标准中还明确限定了各个数据类型最少占用的位数。
整数类型 | 等价类型 | C++11标准规定占用最少位数 |
---|---|---|
short | short int(有符号短整型) | 至少 16 位(2 个字节) |
signed short | short int(有符号短整型) | 至少 16 位(2 个字节) |
signed short int | short int(有符号短整型) | 至少 16 位(2 个字节) |
unsigned short | unsigned short int(无符号短整型) | 至少 16 位(2 个字节) |
unsigned short int | unsigned short int(无符号短整型) | 至少 16 位(2 个字节) |
int | int(有符号整形) | 至少 16 位(2 个字节) |
signed | int(有符号整形) | 至少 16 位(2 个字节) |
signed int | int(有符号整形) | 至少 16 位(2 个字节) |
unsigned | unsigned int(无符号整形) | 至少 16 位(2 个字节) |
unsigned int | unsigned int(无符号整形) | 至少 16 位(2 个字节) |
long | long int(有符号长整形) | 至少 32 位(4 个字节) |
long int | long int(有符号长整形) | 至少 32 位(4 个字节) |
signed long | long int(有符号长整形) | 至少 32 位(4 个字节) |
signed long int | long int(有符号长整形) | 至少 32 位(4 个字节) |
unsigned long | unsigned long int(无符号长整形) | 至少 32 位(4 个字节) |
unsigned long int | unsigned long int(无符号长整形) | 至少 32 位(4 个字节) |
long long(C++11) | long long int(有符号超长整形) | 至少 64 位(8 个字节) |
long long int(C++11) | long long int(有符号超长整形) | 至少 64 位(8 个字节) |
signed long long(C++11) | long long int(有符号超长整形) | 至少 64 位(8 个字节) |
signed long long int(C++11) | long long int(有符号超长整形) | 至少 64 位(8 个字节) |
unsigned long long(C++11) | unsigned long long int(无符号超长整型) | 至少 64 位(8 个字节) |
unsigned long long int(C++11) | unsigned long long int(无符号超长整型) | 至少 64 位(8 个字节) |
C++11 标准规定,每种整数类型必须同时具备有符号(signed)和无符号(unsigned)两种类型,且每种具体的有符号整形和无符号整形所占用的存储空间(也就是位数)必须相同。不过需要注意的是,C++11 标准中只限定了每种类型最少占用多少存储空间,不同的平台可以占用不同的存储空间。
在上表罗列的这些数据类型中,long long 超长整型是 C++ 11 标准新添加的。其实早在 1995 年,就有人提议将 long long 整形写入 C++ 98 标准,但被委员会拒绝了。而后 long long 整形被 C99 标准(C语言标准之一)采纳,并逐渐被很多编译器支持,于是 C++ 标准委员会重新决定将 long long 整形写入 C++ 11 标准中。
如同 long 类型整数需明确标注 "L" 或者 "l" 后缀一样,要使用 long long 类型的整数,也必须标注对应的后缀:
- 对于有符号 long long 整形,后缀用 "LL" 或者 "ll" 标识。例如,"10LL" 就表示有符号超长整数 10;
- 对于无符号 long long 整形,后缀用 "ULL"、"ull"、"Ull" 或者 "uLL" 标识。例如,"10ULL" 就表示无符号超长整数 10。
如果不添加任何标识,则所有的整数都会默认为 int 类型。
对于 long long 类型来说,如果想了解当前平台上 long long 整形的取值范围,可以使用<climits>
头文件中与 long long 整形相关的 3 个宏,分别为 LLONG_MIN、LLONG_MAX 和 ULLONG_MIN:
1)LLONG_MIN:代表当前平台上最小的 long long 类型整数;
2)LLONG_MAX:代表当前平台上最大的 long long 类型整数;
3)ULLONG_MIN:代表当前平台上最大的 unsigned long long 类型整数(无符号超长整型的最小值为 0)。
举个例子:
#include <iostream>
#include <iomanip>
#include <climits>
using namespace std;
int main()
{
cout <<"long long最大值:" << LLONG_MIN <<" "<< hex << LLONG_MIN <<"\n";
cout << dec <<"long long最小值:" << LLONG_MAX << " " << hex << LLONG_MAX << "\n";
cout << dec << "unsigned long long最大值:" << ULLONG_MAX << " " << hex << ULLONG_MAX;
return 0;
}
程序执行结果为(不唯一):
long long最大值:-9223372036854775808 8000000000000000
long long最小值:9223372036854775807 7fffffffffffffff
unsigned long long最大值:18446744073709551615 ffffffffffffffff
此程序中,输出了各最大值和最小值对应的十六进制,显然在当前平台(Windows10 64位操作系统)上,long long 超长整型占用 64 位(也就是 16 个字节)的存储空间。
2. C++11:nullptr 初始化空指针
实际开发中,避免产生“野指针”最有效的方法,就是在定义指针的同时完成初始化操作,即便该指针的指向尚未明确,也要将其初始化为空指针。
所谓“野指针”,又称“悬挂指针”,指的是没有明确指向的指针。野指针往往指向的是那些不可用的内存区域,这就意味着像操作普通指针那样使用野指针(例如 &