計算機概論-數字系統

在寫C語言筆記之前,我覺得要先建立一些數字的概念

所以我就挑了大學時候的計算機概論,擷取一些我覺得重要的地方來講囉

之後會按照順序講

  • 數字系統
  • 資料儲存
  • 邏輯運算

這篇是講關於數字系統之間的轉換

定義

這邊只講進位制(positional number system)

一個數字表示為 $ \pm(S_{k-1} \cdots S_{0}.S_{-1} \cdots S_{-l})_{b} $

表示值為 $ N = \pm(S_{k-1}*b^{k-1}+\cdots+S_0*b^0+S_{-1}*b^{-1}+\cdots+S_{-l}*b^{-l}) $

其中S表示為數字的集合,b是基底(base or radix)

十進位系統

十進位系統是以10為基底,由0、1、2、3、4、5、6、7、8、9等十個數字組成,逢10就進位

寫法為:$ (5487)_{10} $,但一般會省略基底表示為:$ 5487 $

整數

十進位整數 $ N $ 可以表示為 $ \pm(S_{k-1}*10^{k-1}+\cdots+S_0*10^0) $

例如 $ 5487 $ 可以表示為 $ 5*10^3+4*10^2+8*10^1+7*10^0 $

浮點數

十進位浮點數 $ R $

可以表示為 $ \pm(\overbrace{S_{k-1}*10^{k-1}+\cdots+S_0*10^0}^{Integer\ part}+\overbrace{S_{-1}*10^{-1}+\cdots+S_{-l}*10^{-l}}^{fractional\ part}) $

例如 $ 42689.2 $ 可以表示為 $ 4*10^4+2*10^3+6*10^2+8*10^1+9*10^0+2*10^{-1} $

二進位系統

二進位系統是以2為基底,由0、1所組成,逢2進位

寫法為$ (101)_2 $

整數

二進位整數 $ N $ 可以表示為 $ \pm(S_{k-1}*2^{k-1}+\cdots+S_0*2^0) $

例如 $ (1011)_2 $ 可以表示為 $ 1*2^3+0*2^2+1*2^1+1*2^0 $

浮點數

二進位浮點數 $ R $ 可以表示為 $ \pm(\overbrace{S_{k-1}*2^{k-1}+\cdots+S_0*2^0}^{Integer\ part}+\overbrace{S_{-1}*2^{-1}+\cdots+S_{-l}*2^{-l}}^{fractional\ part}) $

例如 $ (101.01)_2 $ 可以表示為 $ 1*2^3+0*2^2+1*2^0+0*2^{-1}+1*2^{-2} $

八進位系統

八進位系統是以8為基底,由0、1、2、3、4、5、6、7、所組成,逢8進位

寫法為$ (755)_8 $,也可以寫成$ 0755 $

整數

八進位整數 $ N $ 可以表示為 $ \pm(S_{k-1}*8^{k-1}+\cdots+S_0*8^0) $

例如 $ (1234)_8 $ 可以表示為 $ 1*8^3+2*8^2+3*8^1+4*8^0 $

浮點數

八進位浮點數 $ R $ 可以表示為 $ \pm(\overbrace{S_{k-1}*8^{k-1}+\cdots+S_0*8^0}^{Integer\ part}+\overbrace{S_{-1}*8^{-1}+\cdots+S_{-l}*8^{-l}}^{fractional\ part}) $

例如 $ (765.67)_8 $ 可以表示為 $ 7*8^3+6*8^2+5*8^0+6*8^{-1}+7*8^{-2} $

十六進位系統

十六進位系統是以16為基底

由0、1、2、3、4、5、6、7、8、9、A(10)、B(11)、C(12)、D(13)、E(14)、F(15)所組成,逢16進位

寫法為$ (FF)_{16} $,也可以寫成$ 0xFF $

整數

十六進位整數 $ N $ 可以表示為 $ \pm(S_{k-1}*16^{k-1}+\cdots+S_0*16^0) $

例如 $ (FE98)_{16} $ 可以表示為 $ 15*16^3+14*16^2+9*16^1+8*16^0 $

浮點數

十六進位浮點數 $ R $ 可以表示為

$ \pm(\overbrace{S_{k-1}*16^{k-1}+\cdots+S_0*16^0}^{Integer\ part}+\overbrace{S_{-1}*16^{-1}+\cdots+S_{-l}*16^{-l}}^{fractional\ part}) $

例如 $ (ABC.DEF)_{16} $ 可以表示為

$ 10*16^3+11*16^2+12*16^0+13*16^{-1}+14*16^{-2}+15*16{-3} $

進制轉換

其他進位轉十進位

任何進位要轉成十進位很簡單,轉換方法為

$ N = S_{k-1}*b^{k-1}+\cdots+S_0*b^0+S_{-1}*b^{-1}+\cdots+S_{-l}*b^{-l} $

例1
$$ \begin{split}
&(110.11)_{2} \\
&= 1*2^2+1*2^1+0*2^0+1*2^{-1}+1*2^{-2} \\
&= 4+2+0+0.5+0.25 = 0.75
\end{split} $$

例2
$$ \begin{split}
&(1A.23)_{16} \\
&= 1*16^1+10*16^0+2*16^{-1}+3*16^{-2} \\
&= 16+10+0.125+0.012 = 26.137 \\
\end{split} $$

十進位轉其他進位

整數部分

  1. 轉二進位

$$ \begin{split}
2|\underline{35}& \rightarrow 餘數 1 \\
2|\underline{17}& \rightarrow 餘數 1 \\
2|\underline{8}& \rightarrow 餘數 0 \\
2|\underline{4}& \rightarrow 餘數 0 \\
2|\underline{2}& \rightarrow 餘數 0 \\
1& \rightarrow 餘數 1
\end{split} $$

然後由下到上取出餘數,也就是100011,就可以得到$ (35)_{10} = (100011)_{2} $了

  1. 轉八進位
    $$ \begin{split}
    8|\underline{126}& \rightarrow 餘數 6 $ \\
    8|\underline{15}& \rightarrow 餘數 7 $ \\
    1& \rightarrow 餘數 1
    \end{split} $$

然後由下到上取出餘數,也就是176,就可以得到$ (126)_{10} = (176)_{8} $了

  1. 轉十六進位
    $$ \begin{split}
    16|\underline{126}& \rightarrow 餘數 E(14) \\
    16|\underline{7}& \rightarrow 餘數 7 \\
    0&
    \end{split} $$

然後由下到上取出餘數,也就是E7,就可以得到$ (126)_{10} = (E7)_{16} $了

浮點數部分

  1. 轉二進位
    $$ \begin{split}
    &0.625 \\
    *&\underline{\ \ \ \ \ \ \ 2} \\
    &1.250 \rightarrow 取出1 \\
    &0.250 \\
    *&\underline{\ \ \ \ \ \ \ 2} \\
    &0.500 \rightarrow 取出0 \\
    *&\underline{\ \ \ \ \ \ \ 2} \\
    &1.000 \rightarrow 取出1
    \end{split} $$

然後由上到下取出數字,也就是101,就可以得到$ (0.625)_{10} = (0.101)_2 $了

  1. 轉八進位
    $$ \begin{split}
    &0.171875 \\
    *&\underline{\ \ \ \ \ \ \ \ \ \ \ \ \ 8} \\
    &1.375000 \rightarrow 取出1 \\
    &0.375000 \\
    *&\underline{\ \ \ \ \ \ \ \ \ \ \ \ \ 8} \\
    &3.000000 \rightarrow 取出3 \\
    \end{split} $$

然後由上到下取出數字,也就是13,就可以得到$ (0.171875)_{10} = (0.13)_8 $了

  1. 轉十六進位
    $$ \begin{split}
    &\ \ 0.89453125 \\
    *&\underline{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 16} \\
    &14.31250000 \rightarrow 取出E(14) \\
    &0.312500000 \\
    *&\underline{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 16} \\
    &5.000000000 \rightarrow 取出5 \\
    \end{split} $$

然後由上到下取出數字,也就是E5,就可以得到$ (0.89453125)_{10} = (0.E5)_16 $了

小數從十進位轉到其他進位有可能會產生無限循環的小數,例如 $ (0.1)_{10} = (0.1\overline{99})_{16} $

二進位轉十六進位

整數

由右往左,每四個位元轉成十六進位,如果位數不是四的倍數,則在數字前面補零

例如$ (1010101010)_2 $:$ (\overbrace{0010}^{2}\overbrace{1010}^{A}\overbrace{1010}^{A})_2 $

反過來就是將每位數字從十六進位轉為二進位,然後將結果連接起來

例如$ (12)_{16} $:$ (\overbrace{1}^{0001}\overbrace{2}^{0010})_{16} $

浮點數

由左往右,每四個位元轉成十六進位,如果位數不是四的倍數,則在數字後面補零

例如$ (0.01111)_2 $:$ (0.\overbrace{0111}^{7}\overbrace{1000}^{8})_2 $

反過來就是將每位數字從十六進位轉為二進位,然後將結果連接起來

例如$ (0.5A)_{16} $:$ (\overbrace{5}^{0101}\overbrace{A}^{1010})_{16} $

二進位轉八進位

整數

由右往左,每三個位元轉成八進位,如果位數不是三的倍數,則在數字前面補零

例如$ (1010101)_2 $:$ (\overbrace{001}^{1}\overbrace{010}^{2}\overbrace{101}^{5})_8 $

反過來就是將每位數字從八進位轉為二進位,然後將結果連接起來

例如$ (34)_{8} $:$ (\overbrace{3}^{011}\overbrace{4}^{100})_{8} $

浮點數

由左往右,每三個位元轉成八進位,如果位數不是三的倍數,則在數字後面補零

例如$ (0.0111)_2 $:$ (0.\overbrace{011}^{3}\overbrace{100}^{4})_2 $

反過來就是將每位數字從十六進位轉為二進位,然後將結果連接起來

例如$ (0.57)_{8} $:$ (\overbrace{5}^{101}\overbrace{7}^{111})_{8} $

八進位轉十六進位

其實就把八進位轉成二進位再轉成十六進位而已XD