C++入門教程(15):數(shù)字與進(jìn)制

小古銀的官方網(wǎng)站(完整教程):http://www.xiaoguyin.com/
C++入門教程視頻:https://www.bilibili.com/video/av20868986/


前言

當(dāng)你完成上一部分教程的全部練習(xí)后蚤氏,相信你應(yīng)該可以靈活地使用C++去解決大部分問題矩肩,尤其是數(shù)學(xué)問題呕屎。

本部分教程將講解C++中必須知道的計(jì)算機(jī)基礎(chǔ)知識(shí)呐粘,知道這些知識(shí)可以避免不少的錯(cuò)誤揖庄,還可以對(duì)程序代碼進(jìn)一步優(yōu)化檀夹。由于這部分教程只講解C++需要知道的計(jì)算機(jī)基礎(chǔ)知識(shí)张肾,所以并不會(huì)太多和太復(fù)雜速勇。

計(jì)算機(jī)處理數(shù)據(jù)是由電路控制的前痘,電路只有兩種狀態(tài):關(guān)凛捏,因此計(jì)算機(jī)上的所有數(shù)據(jù)都是二進(jìn)制的數(shù)據(jù),然后用一定的規(guī)則將這些數(shù)據(jù)表示成十進(jìn)制數(shù)字芹缔、文字坯癣、圖片和其他各種各樣的形式,所以接下來的內(nèi)容都是圍繞二進(jìn)制而講解的最欠。

學(xué)習(xí)這部分教程才能更好地理解后續(xù)的教程示罗,只要用心地去學(xué)就不會(huì)有問題惩猫。這部分知識(shí)了解即可不必深入,如果有興趣蚜点,深入也無妨轧房。


在講解二進(jìn)制相關(guān)知識(shí)前,先講解C++中數(shù)值的各種表示方式和各種操作禽额。

數(shù)字分位符

寫代碼的時(shí)候锯厢,難免會(huì)遇到一些比較大的數(shù)。用一個(gè)很小的數(shù)做例子脯倒,例如先賺它一個(gè)億(●'?'●)实辑。那么我們寫代碼的時(shí)候,一億在代碼中的寫法是100000000藻丢。

為了方便閱讀數(shù)字剪撬,可以用單引號(hào)'分隔一下,這個(gè)單引號(hào)叫做數(shù)字分位符悠反。一億就可以寫成這樣子:1'0000'0000残黑,一看就知道一億。

先看以下代碼:

#include <iostream>

int main(void)
{
    std::cout << "一億:" << 1'0000'0000 << std::endl;
    std::cout << "一百萬:" << 1'000'000 << std::endl;
    std::cout << "這種寫法就不好了:" << 1'000'0'0'00'0 << std::endl;
    return 0;
}

輸出結(jié)果:

一億:100000000
一百萬:1000000
這種寫法就不好了:100000000

輸出還是正常的數(shù)值輸出斋否,不會(huì)在輸出的數(shù)值里顯示數(shù)字分位符梨水,因?yàn)?strong>數(shù)字分位符是為了方便閱讀代碼而出現(xiàn)的。但是第三種寫法并不能方便閱讀代碼茵臭,所以不是一個(gè)好的寫法疫诽。

整數(shù)進(jìn)制

對(duì)于一個(gè)十進(jìn)制的15,可以表示成二進(jìn)制的1111旦委,也可以表示成八進(jìn)制的17奇徒,也可以表示成十六進(jìn)制的F。盡管15缨硝、1111摩钙、17F看上去不一樣查辩,但是它們都是同一個(gè)整數(shù)胖笛,只是表示方法不一樣。

先看以下例子:

#include <iostream>

int main(void)
{
    // 以下是十進(jìn)制的15的各種表示方式
    std::cout << 0b1111 << std::endl; // 輸出二進(jìn)制
    std::cout << 017 << std::endl; // 輸出八進(jìn)制
    std::cout << 15 << std::endl; // 輸出十進(jìn)制
    std::cout << 0xF << std::endl; // 輸出十六進(jìn)制
    return 0;
}

輸出結(jié)果:

15
15
15
15

可以看到它們都是輸出15宜岛,因?yàn)樗鼈兌际峭粋€(gè)數(shù)字的不同表示方法匀钧,而std::cout默認(rèn)以十進(jìn)制顯示,所以都顯示15谬返。

在代碼中,默認(rèn)以十進(jìn)制來表示數(shù)字日杈,如果要用其他進(jìn)制表示一個(gè)數(shù)字遣铝,需要一些特殊的說明:

  • 二進(jìn)制需要在數(shù)字的前面加上0b或者0B佑刷,例如要用二進(jìn)制的110:0b110
  • 八進(jìn)制需要在數(shù)字的前面加上0酿炸,例如要用八進(jìn)制的6:06瘫絮。
  • 十進(jìn)制是默認(rèn)的表示方法,不需要特殊說明填硕。
  • 十六進(jìn)制需要在數(shù)字的前面加上0x或者0X麦萤,例如要用十六進(jìn)制的6:0x6

至于為什么不只是用十進(jìn)制扁眯,還要添加這么多表示方式壮莹,其實(shí)很簡單,因?yàn)橛幸恍?shù)學(xué)運(yùn)算姻檀,有時(shí)候命满,不用十進(jìn)制而用其他進(jìn)制運(yùn)算更加容易理解,方便程序員做數(shù)學(xué)運(yùn)算绣版。初學(xué)者只要理解并背下來胶台,以后將會(huì)用得上。

有時(shí)候杂抽,當(dāng)用十六進(jìn)制運(yùn)算完后诈唬,極有可能想看看十六進(jìn)制的結(jié)果,然而缩麸,std::cout默認(rèn)顯示的是十進(jìn)制铸磅。這時(shí)候,我們就要告訴std::cout我要用十六進(jìn)制顯示匙睹。

先看下面例子:

#include <iostream>

int main(void)
{
    std::cout << "十六進(jìn)制 11 + 22 的結(jié)果是:" << std::endl; // 輸出文字
    std::cout << "默認(rèn):" << (0x11 + 0x22) << std::endl; // 默認(rèn)十進(jìn)制顯示
    std::cout << "八進(jìn)制:" << std::oct << (0x11 + 0x22) << std::endl; // 八進(jìn)制顯示
    std::cout << "十六進(jìn)制:" << std::hex << (0x11 + 0x22) << std::endl; // 十六進(jìn)制顯示
    std::cout << "十進(jìn)制:" << std::dec << (0x11 + 0x22) << std::endl; // 改回十進(jìn)制顯示
    return 0;
}

輸出結(jié)果:

十六進(jìn)制 11 + 22 的結(jié)果是:
默認(rèn):51
八進(jìn)制:63
十六進(jìn)制:33
十進(jìn)制:51

當(dāng)我們需要輸出八進(jìn)制時(shí)愚屁,需要先輸出std::oct;當(dāng)我們需要輸出十六進(jìn)制時(shí)痕檬,需要先輸出std::hex霎槐。如果想再次輸出十進(jìn)制,就必須要先輸出std::dec梦谜;否則丘跌,將會(huì)繼續(xù)以前一次使用的進(jìn)制(上面代碼就是十六進(jìn)制)來輸出。其中std::oct唁桩、std::dec闭树、std::hexiostream庫中。

仔細(xì)的你應(yīng)該發(fā)現(xiàn)了荒澡,我沒有寫二進(jìn)制輸出报辱。二進(jìn)制的輸出方法跟上面的有些不同,因?yàn)?code>std::cout沒有直接的二進(jìn)制輸出。如果想輸出二進(jìn)制數(shù)字栅螟,則可以使用std::bitset,它在bitset標(biāo)準(zhǔn)庫中堂飞。使用std::bitset<二進(jìn)制的位數(shù)>(數(shù)字)就可以輸出二進(jìn)制了昼接,具體用法如下:

#include <iostream> // std::cout std::endl
#include <bitset> // std::bitset

int main(void)
{
    std::cout << "十六進(jìn)制 11 + 22 的結(jié)果是:" << std::endl; // 輸出文字
    std::cout << "二進(jìn)制:" << std::bitset<8>(0x11 + 0x22) << std::endl; // 二進(jìn)制顯示
    std::cout << "默認(rèn):" << 0x11 + 0x22 << std::endl; // 默認(rèn)十進(jìn)制顯示
    return 0;
}

輸出結(jié)果:

十六進(jìn)制 11 + 22 的結(jié)果是:
二進(jìn)制:00110011
默認(rèn):51

由于這次輸出不改變std::cout的行為爽篷,所以默認(rèn)還是輸出十進(jìn)制:

std::cout << "默認(rèn):" << 0x11 + 0x22 << std::endl;

代碼中,std::bitset<8>(0x11 + 0x22)指定了8位二進(jìn)制(不足8位則在左邊用0補(bǔ)夠8位):

浮點(diǎn)型

浮點(diǎn)型即小數(shù)慢睡。

浮點(diǎn)型的表示方法

  • 普通的表示方法:3.14逐工、.2(即0.2)、10.(即10.0)漂辐。
  • 科學(xué)記數(shù)法:2e2(即 2.0 * 10^2 = 200.0)泪喊,0x1.p10(即 1.0 * 2^10 = 1024.0)
  • 十六進(jìn)制與科學(xué)記數(shù)法:0xf.p-10xf.即十進(jìn)制的15.00xf.p-1即 15.0 * 2^(-1) = 7.5)者吁、0xa.bp100xa.b即十進(jìn)制的10.6875窘俺,0xa.bp10即 10.6875 * 2^10 = 10944.0)

同樣,輸出顯示十六進(jìn)制浮點(diǎn)型需要先輸出std::hexfloat复凳,它在iostream標(biāo)準(zhǔn)庫中:

#include <iostream>

int main(void)
{
    std::cout << std::dec << 0xf.p1 << std::endl; // 十進(jìn)制的30.0
    std::cout << std::hexfloat << 0xf.p1 << std::endl; // 十進(jìn)制的30.0
    return 0;
}

輸出結(jié)果:

30
0x1.e00000p+4

補(bǔ)充知識(shí)(了解即可)

  1. 數(shù)字分位符從C++11開始加入瘤泪。
  2. 二進(jìn)制表示法(即0b)從C++11開始加入。
  3. 十六進(jìn)制的浮點(diǎn)型表示方法和十六進(jìn)制的浮點(diǎn)型科學(xué)記數(shù)法從C++17開始加入育八。
  4. std::hexfloat從C++17開始加入对途。

鞏固練習(xí)

輸入三個(gè)整數(shù)ab髓棋,c实檀,然后分別按順序以八進(jìn)制,十進(jìn)制按声,十六進(jìn)制的表示方法膳犹,輸出這三個(gè)整數(shù)的和。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末签则,一起剝皮案震驚了整個(gè)濱河市须床,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渐裂,老刑警劉巖豺旬,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異柒凉,居然都是意外死亡族阅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門膝捞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坦刀,“玉大人,你說我怎么就攤上這事±鹨#” “怎么了央渣?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長渴频。 經(jīng)常有香客問我,道長北启,這世上最難降的妖魔是什么卜朗? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮咕村,結(jié)果婚禮上场钉,老公的妹妹穿的比我還像新娘。我一直安慰自己懈涛,他們只是感情好逛万,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著批钠,像睡著了一般宇植。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上埋心,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天指郁,我揣著相機(jī)與錄音,去河邊找鬼拷呆。 笑死闲坎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的茬斧。 我是一名探鬼主播腰懂,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼项秉!你這毒婦竟也來了绣溜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤伙狐,失蹤者是張志新(化名)和其女友劉穎涮毫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贷屎,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡罢防,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唉侄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咒吐。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恬叹,到底是詐尸還是另有隱情候生,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布绽昼,位于F島的核電站唯鸭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏硅确。R本人自食惡果不足惜目溉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望菱农。 院中可真熱鬧缭付,春花似錦、人聲如沸循未。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽的妖。三九已至绣檬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間羔味,已是汗流浹背河咽。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赋元,地道東北人忘蟹。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像搁凸,于是被迫代替她去往敵國和親媚值。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361