C++入門教程(15):數字與進制

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


前言

當你完成上一部分教程的所有練習後,相信你應該能夠靈活地使用C++去解決大部分問題,尤爲是數學問題。程序員

本部分教程將講解C++中必須知道的計算機基礎知識,知道這些知識能夠避免很多的錯誤,還能夠對程序代碼進一步優化。因爲這部分教程只講解C++須要知道的計算機基礎知識,因此並不會太多和太複雜。ide

計算機處理數據是由電路控制的,電路只有兩種狀態:,所以計算機上的全部數據都是二進制的數據,而後用必定的規則將這些數據表示成十進制數字、文字、圖片和其餘各類各樣的形式,因此接下來的內容都是圍繞二進制而講解的。學習

學習這部分教程才能更好地理解後續的教程,只要用心地去學就不會有問題。這部分知識瞭解便可沒必要深刻,若是有興趣,深刻也無妨。優化


在講解二進制相關知識前,先講解C++中數值的各類表示方式和各類操做。網站

數字分位符

寫代碼的時候,不免會遇到一些比較大的數。用一個很小的數作例子,例如先賺它一個億(●'◡'●)。那麼咱們寫代碼的時候,一億在代碼中的寫法是100000000code

爲了方便閱讀數字,能夠用單引號'分隔一下,這個單引號叫作數字分位符。一億就能夠寫成這樣子: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;
}

輸出結果:圖片

一億:100000000
一百萬:1000000
這種寫法就很差了:100000000

輸出仍是正常的數值輸出,不會在輸出的數值裏顯示數字分位符,由於數字分位符是爲了方便閱讀代碼而出現的。可是第三種寫法並不能方便閱讀代碼,因此不是一個好的寫法。

整數進制

對於一個十進制的15,能夠表示成二進制的1111,也能夠表示成八進制的17,也能夠表示成十六進制的F。儘管15111117F看上去不同,可是它們都是同一個整數,只是表示方法不同。

先看如下例子:

#include <iostream>

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

輸出結果:

15
15
15
15

能夠看到它們都是輸出15,由於它們都是同一個數字的不一樣表示方法,而std::cout默認以十進制顯示,因此都顯示15

在代碼中,默認以十進制來表示數字,若是要用其餘進製表示一個數字,須要一些特殊的說明:

  • 二進制須要在數字的前面加上0b或者0B,例如要用二進制的110:0b110
  • 八進制須要在數字的前面加上0,例如要用八進制的6:06
  • 十進制是默認的表示方法,不須要特殊說明。
  • 十六進制須要在數字的前面加上0x或者0X,例如要用十六進制的6:0x6

至於爲何不僅是用十進制,還要添加這麼多表示方式,其實很簡單,由於有一些數學運算,有時候,不用十進制而用其餘進制運算更加容易理解,方便程序員作數學運算。初學者只要理解並背下來,之後將會用得上。

有時候,當用十六進制運算完後,極有可能想看看十六進制的結果,然而,std::cout默認顯示的是十進制。這時候,咱們就要告訴std::cout我要用十六進制顯示。

先看下面例子:

#include <iostream>

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

輸出結果:

十六進制 11 + 22 的結果是:
默認:51
八進制:63
十六進制:33
十進制:51

當咱們須要輸出八進制時,須要先輸出std::oct;當咱們須要輸出十六進制時,須要先輸出std::hex。若是想再次輸出十進制,就必需要先輸出std::dec;不然,將會繼續之前一次使用的進制(上面代碼就是十六進制)來輸出。其中std::octstd::decstd::hexiostream庫中。

仔細的你應該發現了,我沒有寫二進制輸出。二進制的輸出方法跟上面的有些不一樣,由於std::cout沒有直接的二進制輸出。若是想輸出二進制數字,則可使用std::bitset,它在bitset標準庫中。使用std::bitset<二進制的位數>(數字)就能夠輸出二進制了,具體用法以下:

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

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

輸出結果:

十六進制 11 + 22 的結果是:
二進制:00110011
默認:51

因爲此次輸出不改變std::cout的行爲,因此默認仍是輸出十進制:

std::cout << "默認:" << 0x11 + 0x22 << std::endl;

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

浮點型

浮點型即小數。

浮點型的表示方法

  • 普通的表示方法:3.14.2(即0.2)、10.(即10.0)。
  • 科學記數法:2e2(即 2.0 * 10^2 = 200.0),0x1.p10(即 1.0 * 2^10 = 1024.0)
  • 十六進制與科學記數法:0xf.p-10xf.即十進制的15.00xf.p-1即 15.0 2^(-1) = 7.5)、0xa.bp100xa.b即十進制的10.68750xa.bp10即 10.6875 2^10 = 10944.0)

一樣,輸出顯示十六進制浮點型須要先輸出std::hexfloat,它在iostream標準庫中:

#include <iostream>

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

輸出結果:

30
0x1.e00000p+4

補充知識(瞭解便可)

  1. 數字分位符從C++11開始加入。
  2. 二進制表示法(即0b)從C++11開始加入。
  3. 十六進制的浮點型表示方法和十六進制的浮點型科學記數法從C++17開始加入。
  4. std::hexfloat從C++17開始加入。

鞏固練習

輸入三個整數abc,而後分別按順序以八進制,十進制,十六進制的表示方法,輸出這三個整數的和。

相關文章
相關標籤/搜索