1. 程式人生 > >(二)擴展的整型

(二)擴展的整型

體系 標準 stream 整型轉換 大小 情況下 body 沒有 out

我們會在代碼中發現一些整型的名字,比如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的規範。

這一部分都是大家編程時候常遇到的,也是一點常識性的東西,就不再做過多的表述了。

感謝您的閱讀,生活愉快~

(二)擴展的整型