登堂入室C++之基礎(chǔ)類型

類型

C++的類型分為基礎(chǔ)類型和復(fù)合類型勃黍。

基礎(chǔ)類型

基礎(chǔ)類型包含以下類型

void

void:表示空剑辫,比如表示函數(shù)什么都不返回诊沪。

nullptr_t

nullptr_t: 也就是空指針字面變量(nullptr)的類型贸毕。它的特殊之處在于這個類型本身并不是一個普通指針類型忆谓,也不是一個指向成員的指針類型盟迟。它的值(nullptr)是一個null pointer constants秋泳,可以隱式轉(zhuǎn)換為任何指針或者指向成員的指針類型。

整數(shù)類型

  1. bool類型

  2. 字符類型:

窄字符類型有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的字符。

  1. 無符號整數(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)代箭。

對于一個二進制序列b_n b_{n-1} b_{n-1} b_{n-3} \cdots b_b b_0墩划,其表達的十進制值為:
v = \sum_{i=0}^n b_i 2^i

比如一個3比特的二進制,我們有

overflow-uint.jpg
  1. 有符號整數(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ù)中我們用最高比特用來表達-2^{n-1},其它比特按照無符號整數(shù)進行表達极景,表達的十進制為
v = -2^{n-1}b_n + \sum_{i=0}^{n-1}b_i2^i

3比特的的表達我們可以表示如下圖:

overflow-int-3.jpg

純粹從2進制比特來看蚣旱,對于一個有符號整數(shù),-x的表示(x>0)是x的二進制取反加上1戴陡。

比如上圖中2的二進制為010塞绿, -2的二進制110,恰好是010取反得到的101加上1得到恤批。

浮點數(shù)類型

浮點類型包括float, double, long double异吻。都是使用IEEE 754標準表達。

IEEE 754表達方式為:

| sign | exponent | fractional |

浮點數(shù)的二進制表示分為三個部分

  1. 1位表示符號(記做s):0表示正數(shù)喜庞,1表示負數(shù)诀浪;
  2. k位表示指數(shù)(記做E):(e_{k?1}e_{k?2}e_{k?3}...e_0)_2
  3. n位表示小數(shù)部分(記做M):(m_1m_2m_3...m_n)_2=m_1×2^{?1}+m_2×2^{?2}+?+m_n×2^{?n}

浮點數(shù)就表示為(?1)^s×M×2^E

對于32位的浮點數(shù)延都,k=8雷猪, n=23;對于64位的浮點數(shù)晰房,k=11求摇,n=52。

首先根據(jù)表示指數(shù)的位數(shù)我們設(shè)置一個偏移量Bias(Bias=2^{k?1}?1)殊者。這個偏移量來干什么呢与境?k比特的二進制數(shù)是一個大于等于0的十進制數(shù),是沒有辦法表達負數(shù)的猖吴。而我們其實是需要負數(shù)來表示小于1的數(shù)的摔刁。所以我們設(shè)置一個偏移量來干這個事情。

對于浮點的指數(shù)部分海蔽,在不考慮Bias的情況下共屈,k個比特能夠表達0到2^k?1的數(shù)字,但是我們把全1用來表達無窮大党窜,把全0用來表示小于0的數(shù)拗引,所以還剩下1到2^k?2部分。

表達分為三種:

  1. 當指數(shù)不是全0和全1的時候刑然,我們稱為normalized浮點數(shù)表示寺擂,指數(shù)E=e?Bias,其中e是(e_{k?1}e_{k?2}e_{k?3}...e_0)表達的無符號數(shù)。由于我們使用了全0的指數(shù)來表達絕對值小于1的數(shù)怔软,我們認為這部分數(shù)的小數(shù)部分是M=1+f垦细,其中f是(m_1m_2m_3...m_n)_2表示的小數(shù)部分,0\le f \le 1, 1\le 1+f \le 2挡逼。
  2. 當指數(shù)全部都是0的時候括改,我們稱為denormalized浮點表示,指數(shù)E=1?Bias家坎,小數(shù)部分為M=f嘱能。這里需要注意的是當f的每個數(shù)位都為0的時候,f為0虱疏。但是s為0的時候表示+0惹骂,為1的時候表示-0。也就是IEEE 754B標準中0不唯一做瞪。
  3. 當指數(shù)全部為1的時候对粪,我們表示無窮大。s為0的時候表示+\infty装蓬,為1的時候表示-\infty著拭。

考慮一個6比特的浮點數(shù),其中我們使用1比特表示符號牍帚,3比特表示指數(shù)儡遮,2個比特表示小數(shù)。\text{Bias}=2^2?1=3暗赶。

首先我們來看normalized浮點表示:
指數(shù)E_{max}=2^3?2?Bias=3, E_{min}=1?3=?2鄙币。

而對于denormalized類型浮點:
指數(shù)E_{max}=1?Bias=1?3=?2

我們打印出除了無窮大之外的所有大于等于0的數(shù)如下表,小于0的部分只需要前面加上負號忆首。

類型 二進制
normalized 2^3(1+\frac{1}{2}+\frac{1}{4})=14 0 110 11
normalized 2^3(1+\frac{1}{2}+0)=12 0 110 10
normalized 2^3(1+0+\frac{1}{4})=10 0 110 01
normalized 2^3(1+0+0)=8 0 110 00
normalized 2^2(1+\frac{1}{2}+\frac{1}{4})=7 0 101 11
normalized 2^2(1+\frac{1}{2}+0)=6 0 101 10
normalized 2^2(1+0+\frac{1}{4})=5 0 101 01
normalized 2^2(1+0+0)=4 0 101 00
normalized 2^1(1+\frac{1}{2}+\frac{1}{4})=3.5 0 100 11
normalized 2^1(1+\frac{1}{2}+0)=3 0 100 10
normalized 2^1(1+0+\frac{1}{4})=2.5 0 100 01
normalized 2^1(1+0+0)=2 0 100 00
normalized 2^0(1+\frac{1}{2}+\frac{1}{4})=1.75 0 011 11
normalized 2^0(1+12+0)=1.5 0 011 10
normalized 2^0(1+0+\frac{1}{4})=1.25 0 011 01
normalized 2^0(1+0+0)=1 0 011 00
normalized 2^{?1}(1+\frac{1}{2}+\frac{1}{4})=0.875 0 010 11
normalized 2^{?1}(1+\frac{1}{2}+0)=0.75 0 010 10
normalized 2^{?1}(1+0+\frac{1}{4})=0.625 0 010 01
normalized 2^{?1}(1+0+0)=0.5 0 010 00
normalized 2^{?2}(1+\frac{1}{2}+\frac{1}{4})=0.4375 0 001 11
normalized 2^{?2}(1+\frac{1}{2}+0)=0.375 0 001 10
normalized 2^{?2}(1+0+\frac{1}{4}14)=0.3125 0 001 01
normalized 2^{?2}(1+0+0)=0.25 0 001 00
denormalized 2^{?2}(\frac{1}{2}+\frac{1}{4})=0.1875 0 000 11
denormalized 2^{?2}(\frac{1}{2}+0)=0.125 0 000 10
denormalized 2^{?2}(0+\frac{1}{4})=0.0625 0 000 01
denormalized 2^{?2}(0+0)=0 0 000 00

對于32位的浮點數(shù)爱榔,使用了8位來表示指數(shù)被环,那么\text{Bias}=2^7?1=127

  1. normalized表示的時候, E_{max}=2^8?2?Bias=127, E_{min}=1?127=?126;
  2. denormalized表示的時候,E=1?127=?126

也就是說:

  • 大于0的最大的浮點數(shù)的比特為0 11111110 11111111111111111111111
  • 大于0的次大的浮點數(shù)的比特為0 11111110 11111111111111111111110
  • 大于0的次小的浮點數(shù)的比特為0 00000000 00000000000000000000010
  • 大于0的最小的浮點數(shù)的比特為0 00000000 00000000000000000000001

作者:杜凌霄
更多文章發(fā)布在公眾號“探知軒”糙及,歡迎關(guān)注。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筛欢,一起剝皮案震驚了整個濱河市浸锨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌版姑,老刑警劉巖柱搜,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異剥险,居然都是意外死亡聪蘸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來健爬,“玉大人控乾,你說我怎么就攤上這事∧茸瘢” “怎么了蜕衡?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長设拟。 經(jīng)常有香客問我慨仿,道長,這世上最難降的妖魔是什么纳胧? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任镰吆,我火速辦了婚禮,結(jié)果婚禮上跑慕,老公的妹妹穿的比我還像新娘鼎姊。我一直安慰自己,他們只是感情好相赁,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布相寇。 她就那樣靜靜地躺著,像睡著了一般钮科。 火紅的嫁衣襯著肌膚如雪唤衫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天绵脯,我揣著相機與錄音佳励,去河邊找鬼。 笑死蛆挫,一個胖子當著我的面吹牛赃承,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悴侵,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瞧剖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了可免?” 一聲冷哼從身側(cè)響起抓于,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浇借,沒想到半個月后捉撮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡妇垢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年巾遭,在試婚紗的時候發(fā)現(xiàn)自己被綠了肉康。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡灼舍,死狀恐怖迎罗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情片仿,我是刑警寧澤纹安,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站砂豌,受9級特大地震影響厢岂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阳距,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一塔粒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧筐摘,春花似錦卒茬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至馍管,卻和暖如春郭赐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背确沸。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工捌锭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人罗捎。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓观谦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親桨菜。 傳聞我的和親對象是個殘疾皇子豁状,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容