小古銀的官方網(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
摩钙、17
、F
看上去不一樣查辩,但是它們都是同一個(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::hex
在iostream
庫中。
仔細(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-1
(0xf.
即十進(jìn)制的15.0
,0xf.p-1
即 15.0 * 2^(-1) = 7.5)者吁、0xa.bp10
(0xa.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í)(了解即可)
- 數(shù)字分位符從C++11開始加入瘤泪。
- 二進(jìn)制表示法(即
0b
)從C++11開始加入。 - 十六進(jìn)制的浮點(diǎn)型表示方法和十六進(jìn)制的浮點(diǎn)型科學(xué)記數(shù)法從C++17開始加入育八。
-
std::hexfloat
從C++17開始加入对途。
鞏固練習(xí)
輸入三個(gè)整數(shù)a
,b
髓棋,c
实檀,然后分別按順序以八進(jìn)制,十進(jìn)制按声,十六進(jìn)制的表示方法膳犹,輸出這三個(gè)整數(shù)的和。