(二)扩展的整型

我们会在代码中发现一些整型的名字,比如UINT、__int16、u64、int64_t,等等。

这些类型有的源自于编译器的自行扩展,有的则是来自某些编程环境(比如工作在Linux内核代码中),不一而足。

而事实上,在C++11中一共只定义了以下5种标准的有符号整型:

· signed char

· short int

· int 

· long int

· long long int

标准同时规定,每一种有符号整型都有一种对应的无符号整数版本,且有符号整型与其对应的无符号整型具有相同的存储空间大小。

比如与signed int 对应的无符号版本的整型是unsigned int

#include<iostream>
using namespace std;

int main()
{
    cout << sizeof(unsigned char) << " , " << sizeof(signed char) << endl;
    cout << sizeof(unsigned short) <<" , "<< sizeof(signed short) << endl;
    cout << sizeof(unsigned int) << " , " << sizeof(signed int) << endl;
    cout << sizeof(unsigned long) << " , " << sizeof(signed long) << endl;
    cout << sizeof(unsigned long long) << " , " << sizeof(signed long long) << endl;
}

在实际编程中,由于这5种基本的整型适用性有限,所以有时编译器出于需要,也会自行扩展一些整型。

这些扩展类型的长度(占用内存的位数)可以比最长的标准整型(long long int,通常是一个64位长度的数据)还长,也可以介于两个标准整数的位数之间(比如128位、48位等)

C++11规定,扩展的整型必须和标准类型一样,有符号和无符号类型占用同样大小的内存空间。

而对于C/C++,整型间会发生隐式的转换,这种过程通常被称为整型提升Integral Promotion

整型提升依靠的是一个“等级”体系

· 长度越大的整型等级越高,比如long long int 的等级会高于 int。

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

· 相同大小的有符号类型和无符号类型的等级相同

而在进行隐式的整型转换的时候,一般是按照低等级整型转换为高等级整型,有符号的转换为无符号的。

在这样的规则支持下,如果编译器定义一些自由的整型,即使这样定义的整型由于名称并没有被标准收入,因而可移植性并不能得到保证,但至少编译器开发者和程序员不用担心自定义的扩展整型与标准整型之间在使用规则上(尤其是整型提升)存在着不同的认识了。

比如:在一个128位的构架上,编译器可以定义_int128_t为128位的有符号整型(对应无符号类型为_uint128_t)。于是程序员可以使用_int128_t类型保存形如+92233720368547758070的超长整数(长于64的自然数)。而不用查看编译器文档我们也会知道,一旦遇到整型提升,按照上面的规则,比如_int128_t  a,与任何短于它的类型的数据b进行运算(比如加法)是,都会导致b被隐式地转换为_int128_t的整型,因为扩展的整型必须遵守C++11的规范。

这一部分都是大家编程时候常遇到的,也是一点常识性的东西,就不再做过多的表述了。 

感谢您的阅读,生活愉快~

原文地址:https://www.cnblogs.com/lv-anchoret/p/8411267.html