C/C++基本数据类型
C/C++语言有一组基本数据类型,对应于计算机的基本存储单元和使用这些单元去保存数据的一些常用方式。
基本数据类型如下:
上面表格中的类型是基本的C/C++数据类型,但是在C++11中又有了一些扩展。
C++11中long long整型
相比于C++98标准,C++11整型的最大改变就是多了long long,1995年long long就被提议写入C++98标准,却被C++标准委员会拒绝了。后来,long long类型却进入了C99标准,而且也事实上被很多编译器支持。于是辗转地,C++标准委员会又决定将long long纳入C++11标准。
long long类型有两种:long long和unsigned long long。在C++11中,标准要求long long整型可以在不同的平台上有不同的位长度。但至少要有64位。
在常数字面量时,可以使用LL后缀(或是ll)标识一个long long类型的字面量,而ULL(不区分大小写)表示一个unsigned long long类型的字面量。
long long int lli = -90000000000000000LL;//定义一个有符号的long long变量lli unsigned long long int ulli = 90000000000000000LL;//定义一个无符号的unsigned long long变量ulli
在C++11中,还有很多与long long等价的类型。比如对于有符号的,下面的类型是等价的:long long、signed long long、long long int、signed long long int这些是一样的;unsigned long long和unsigned long long int也是等价的。
提示:虽然在不同的平台上long long的位数可能不同,但是可以查看<climits>或者<limits.h>中的宏来查看long long的大小。与long long整型相关的一共有三个宏LLONG_MIN、LLONG_MAX和ULLONG_MIN,他们分别代表平台上最小的long long值,最大的long long值,以及最大的unsigned long long值。
//C++程序查看LLONG_MAX和LLONG_MIN的代码实现 #include <climits> #include <cstdio> using namespace std; int main(int argc, char *argv[]) { long long ll_min = LLONG_MIN; long long ll_man = LLONG_MAX; unsigned long long ull_max = ULLONG_MAX; printf("min of long long: %lld ", ll_min); printf("max of long long: %lld ", ll_max); printf("max of unsigned long long: %llu ", ull_max); return 0; }
测试平台是Ubuntu的Linux系统,unsigned long long是64位的类型,所以unsigned long long的最大值是0xFFFFFFFFFFFFFFFF(16个F)。
扩展的整型
程序员会在代码中发现一些整型的名字,比如UINT、__int16、u64、int64_t,这些类型有的源自编译器的自行扩展,有的则是来自某些编程环境(比如工作在Linux内核中的代码)。
而事实上,在C++11中一共定义了以下5种标准的有符号整型:
标准同时规定,每一种有符号整型都有一种对应的无符号的整数版本,且有符号整型与其对应的无符号整型具有相同大小的存储空间。
在实际的编程中,这5中基本的整型适用性有限,所以C++11允许编译器进行一些扩展,但是对扩展的整型的使用规则做出了一些限制:
C++11规定,扩展的整型必须和标准的类型一样,有符号类型和无符号类型占用同样大小的内存空间。
由于C/C++是一种弱类型语言,当运算、传参等类型不匹配的时候,整型间会发生隐式的转换,这种过程通常被称为整型的提升。
比如如下的表达式: (int)a + (long long)b 通常会导致变量a提升为long long类型后才与b进行运算。同时,无论是扩展的整型还是标准的整型,其转换的规则由他们的“等级”决定,转换的规则如下:
(1)长度越大的整型等级越高,比如long long int的等级会高于int。
(2)长度相同的情况下,标准整型的等级高于扩展类型。比如long long int和_int64如果都是64位长度,则long long int类型的等级更高。
(3)相同大小的有符号和无符号类型的等级相同,long long int和unsigned long long int的等级相同。但是在进行隐式的整型转换的时候,一般是有符号的转换为无符号的。