類型
C++的類型分為基礎(chǔ)類型和復(fù)合類型勃黍。
基礎(chǔ)類型
基礎(chǔ)類型包含以下類型
void
void
:表示空剑辫,比如表示函數(shù)什么都不返回诊沪。
nullptr_t
nullptr_t
: 也就是空指針字面變量(nullptr)的類型贸毕。它的特殊之處在于這個類型本身并不是一個普通指針類型忆谓,也不是一個指向成員的指針類型盟迟。它的值(nullptr)是一個null pointer constants秋泳,可以隱式轉(zhuǎn)換為任何指針或者指向成員的指針類型。
整數(shù)類型
bool類型
字符類型:
窄字符類型有char, signed char, unsigned char
攒菠。c++20又引入了char8_t
迫皱。
char
類型一直以來的問題就是有的平臺是有符號數(shù)數(shù),有的平臺是無符號數(shù)。X86 GNU/Linux和Windows使用的是signed char
卓起,而PowerPC和ARM處理器一般都是使用unsigned char
作為char
和敬。
char8_t
引入指定了使用的是unsigned char
,但是它并不是unsigned char
的別名戏阅,而是一個新的類型昼弟。它用來保證一定可以裝下utf-8的字符。
寬字符類型有wchar_t
奕筐,c++11中引入了char16_t, char32_t
舱痘。
需要注意的是char16_t
是用來存儲UTF-16的字符,它是uint_least16_t
的別名离赫。也就是說:1. 它保證是無符號的芭逝;2. 至少有16比特,但是不一定渊胸,可能有20比特旬盯,也可能有32比特。char32_t
也是一樣的翎猛,是uint_least32_t
的別名胖翰,用來存儲UTF-32的字符。
- 無符號整數(shù)
包括unsigned short int, unsigned int, unsigned long int
办成。從C99(C語言1999標準)泡态,頭文件stdint.h
引入了如下的無符號類型:
-
uint8_t
: 精確的8比特無符號數(shù) -
uint16_t
: 精確的16比特無符號數(shù) -
uint32_t
: 精確的32比特無符號數(shù) -
uint64_t
: 精確的64比特無符號數(shù)
還有如下fast系列
-
uint_fast8_t
:至少8比特的最快的無符號整數(shù)類型 -
uint_fast16_t
:至少16比特的最快的無符號整數(shù)類型 -
uint_fast32_t
:至少32比特的最快的無符號整數(shù)類型 -
uint_fast64_t
:至少64比特的最快的無符號整數(shù)類型
以及最小內(nèi)存系列
-
uint_least8_t
:至少8比特的無符號整數(shù)類型 -
uint_least16_t
:至少16比特的無符號整數(shù)類型 -
uint_least32_t
:至少32比特的無符號整數(shù)類型 -
uint_least64_t
:至少64比特的無符號整數(shù)類型
個人理解是fast系列偏向速度搂漠,least系列偏向內(nèi)存消耗迂卢。比如寄存器至少都是16位的,那么uint_fast8_t
選擇uint16_t
應(yīng)該就比uint8_t
要好桐汤。而對于uint_least8_t
就剛好相反而克,它更看中存儲大小,選擇uint8_t
更好怔毛。
fast和least系列大家使用不多员萍。日常編程建議使用精確大小的無符號類型,這樣確定知道大小拣度。因為c++標準是沒有規(guī)定具體大小的碎绎,只是規(guī)定了signed char, unsigned char
是至少有8比特;short int, unsigned short int
是至少有16比特抗果;int, unsigned int
至少有16比特筋帖;long int, unsigned long int
至少有32比特;long long int, unsigned long long int
至少有64比特冤馏。所以我們只知道至少多少比特日麸,并不知道具體多少比特,如果我們的程序是需要跨平臺的逮光,就可能在不同平臺出現(xiàn)不一致的表現(xiàn)代箭。
對于一個二進制序列墩划,其表達的十進制值為:
比如一個3比特的二進制,我們有
- 有符號整數(shù)
包括short int, int, long int
嗡综。從C99(C語言1999標準)乙帮,頭文件stdint.h
引入了如下的無符號類型:
-
int8_t
: 精確的8比特有符號數(shù) -
int16_t
: 精確的16比特有符號數(shù) -
int32_t
: 精確的32比特有符號數(shù) -
int64_t
: 精確的64比特有符號數(shù)
還有如下fast系列
-
int_fast8_t
:至少8比特的最快的有符號整數(shù)類型 -
int_fast16_t
:至少16比特的最快的有符號整數(shù)類型 -
int_fast32_t
:至少32比特的最快的有符號整數(shù)類型 -
int_fast64_t
:至少64比特的最快的有符號整數(shù)類型
以及最小內(nèi)存系列
-
int_least8_t
:至少8比特的有符號整數(shù)類型 -
int_least16_t
:至少16比特的有符號整數(shù)類型 -
int_least32_t
:至少32比特的有符號整數(shù)類型 -
int_least64_t
:至少64比特的有符號整數(shù)類型
n比特的有符號整數(shù)中我們用最高比特用來表達,其它比特按照無符號整數(shù)進行表達极景,表達的十進制為
3比特的的表達我們可以表示如下圖:
純粹從2進制比特來看蚣旱,對于一個有符號整數(shù),的表示(
)是
的二進制取反加上1戴陡。
比如上圖中2的二進制為010塞绿, -2的二進制110,恰好是010取反得到的101加上1得到恤批。
浮點數(shù)類型
浮點類型包括float, double, long double
异吻。都是使用IEEE 754標準表達。
IEEE 754表達方式為:
| sign | exponent | fractional |
浮點數(shù)的二進制表示分為三個部分
- 1位表示符號(記做s):0表示正數(shù)喜庞,1表示負數(shù)诀浪;
- k位表示指數(shù)(記做E):
- n位表示小數(shù)部分(記做M):
浮點數(shù)就表示為。
對于32位的浮點數(shù)延都,k=8雷猪, n=23;對于64位的浮點數(shù)晰房,k=11求摇,n=52。
首先根據(jù)表示指數(shù)的位數(shù)我們設(shè)置一個偏移量Bias(Bias=)殊者。這個偏移量來干什么呢与境?k比特的二進制數(shù)是一個大于等于0的十進制數(shù),是沒有辦法表達負數(shù)的猖吴。而我們其實是需要負數(shù)來表示小于1的數(shù)的摔刁。所以我們設(shè)置一個偏移量來干這個事情。
對于浮點的指數(shù)部分海蔽,在不考慮Bias的情況下共屈,k個比特能夠表達0到的數(shù)字,但是我們把全1用來表達無窮大党窜,把全0用來表示小于0的數(shù)拗引,所以還剩下1到
部分。
表達分為三種:
- 當指數(shù)不是全0和全1的時候刑然,我們稱為normalized浮點數(shù)表示寺擂,指數(shù)
,其中e是
表達的無符號數(shù)。由于我們使用了全0的指數(shù)來表達絕對值小于1的數(shù)怔软,我們認為這部分數(shù)的小數(shù)部分是
垦细,其中f是
表示的小數(shù)部分,
挡逼。
- 當指數(shù)全部都是0的時候括改,我們稱為denormalized浮點表示,指數(shù)
家坎,小數(shù)部分為
嘱能。這里需要注意的是當f的每個數(shù)位都為0的時候,f為0虱疏。但是s為0的時候表示+0惹骂,為1的時候表示-0。也就是IEEE 754B標準中0不唯一做瞪。
- 當指數(shù)全部為1的時候对粪,我們表示無窮大。s為0的時候表示
装蓬,為1的時候表示
著拭。
考慮一個6比特的浮點數(shù),其中我們使用1比特表示符號牍帚,3比特表示指數(shù)儡遮,2個比特表示小數(shù)。暗赶。
首先我們來看normalized浮點表示:
指數(shù)鄙币。
而對于denormalized類型浮點:
指數(shù)
我們打印出除了無窮大之外的所有大于等于0的數(shù)如下表,小于0的部分只需要前面加上負號忆首。
類型 | 值 | 二進制 |
---|---|---|
normalized | 0 110 11 | |
normalized | 0 110 10 | |
normalized | 0 110 01 | |
normalized | 0 110 00 | |
normalized | 0 101 11 | |
normalized | 0 101 10 | |
normalized | 0 101 01 | |
normalized | 0 101 00 | |
normalized | 0 100 11 | |
normalized | 0 100 10 | |
normalized | 0 100 01 | |
normalized | 0 100 00 | |
normalized | 0 011 11 | |
normalized | 0 011 10 | |
normalized | 0 011 01 | |
normalized | 0 011 00 | |
normalized | 0 010 11 | |
normalized | 0 010 10 | |
normalized | 0 010 01 | |
normalized | 0 010 00 | |
normalized | 0 001 11 | |
normalized | 0 001 10 | |
normalized | 0 001 01 | |
normalized | 0 001 00 | |
denormalized | 0 000 11 | |
denormalized | 0 000 10 | |
denormalized | 0 000 01 | |
denormalized | 0 000 00 |
對于32位的浮點數(shù)爱榔,使用了8位來表示指數(shù)被环,那么
- normalized表示的時候,
,
;
- denormalized表示的時候,
也就是說:
- 大于0的最大的浮點數(shù)的比特為0 11111110 11111111111111111111111
- 大于0的次大的浮點數(shù)的比特為0 11111110 11111111111111111111110
- 大于0的次小的浮點數(shù)的比特為0 00000000 00000000000000000000010
- 大于0的最小的浮點數(shù)的比特為0 00000000 00000000000000000000001
作者:杜凌霄
更多文章發(fā)布在公眾號“探知軒”糙及,歡迎關(guān)注。