計算機組成原理 - 計算篇

小帥部落格發表於2020-11-26

章節導學

1. 進位制運算的基本知識

 

 

1.1 進位制概述

 

  1. 進位制的定義

    • 有限種數字符號來表示無限的數值
    • 進位制是一種記數方式,亦稱進位計數法或位值計數法
  • 使用的數字符號的數目稱為這種進位制的基數或底數

 

  1. 常見的進位制

    • 二進位制
    • 八進位制
    • 十六進位制
    • 二十進位制
    • 六十進位制

 

 

1.2 二進位制運算的基礎

 

二進位制(整數)轉換十進位制

二進位制(整數)轉換十進位制:按權展開法

正整數N,基數為r

? = ??−1??−2 ⋯ ?1?0

= ??−1r?−1 +??−2 r?−2 + ⋯ + ?1? + ?0

 

例:? = 01100101 = 1 ∗ 26 + 1 ∗ 25 + 1 ∗ 22 + 1 = 101

例:? = 11101101 = 1 ∗ 27 + 1 ∗ 26 + 1 ∗ 25 + 1 ∗ 23 + 1 ∗ 22 + 1 = 237

 

 

 

十進位制(整數)轉換二進位制

十進位制(整數)轉換二進位制:重複相除法

例:(101)10 = ( )2

重複除以2得商取餘數 
101/2501 
50/2250
25/2121
12/260
6/230
3/211
1/201 
二進位制結果01100101  

? = (01100101)2 = 1 ∗ 26 + 1 ∗ 25 + 1 ∗ 22+ 1 = (101)10

 

例:23710 = ( )2

重複除以2得商取餘數 
237/21181 
118/2590
59/2291
29/2141
14/270
7/231
3/211 
1/201 
二進位制結果11101101  

? = (11101101)2 = 1 ∗ 27 + 1 ∗ 26 + 1 ∗ 25 + 1 ∗ 23 + 1 ∗ 2^2 + 1 = (237)10

 

二進位制(小數)轉換十進位制

二進位制(小數)轉換十進位制:按權展開法

小數N,基數為r,從小數點右邊開始,小數點左邊為正,右邊為負

? = ??−1??−2 ⋯ ?1?0

= ??−1r?−1 +??−2 r?−2 + ⋯ + ?1? + ?0

 

例:? = (0.11001) = 1 ∗ 2−1 + 1 ∗ 2−2 + 1 ∗ 2−5 = 0.78125 = 25/32

:? = (0.01011) = 1 ∗ 2−2 + 1 ∗ 2−4 + 1 ∗ 2−5 = 0.34375 = 11/32

 

十進位制(小數)轉換二進位制

十進位制(小數)轉換二進位制:重複相乘法

  1. 重複乘以2
  2. 得積
  3. 取整數部分
  4. 結果按正序排列

 

十進位制(分數)轉換二進位制

十進位制(分數)轉換二進位制:重複相乘法

  1. 重複乘以2
  2. 得積:把假分數化為真分數
  3. 取1:取第一個數值
  4. 結果按正序排列

 

例:25/32轉化為二進位制

重複乘以2得積取1 
25/3250/32= 1+9/161
9/1618/16= 1+1/81
1/81/4= 0+1/40
1/41/2= 0+1/20
1/21= 1+01
二進位制結果0.11001  

? = 0.11001 = 1 ∗ 2−1 + 1 ∗ 2−2 + 1 ∗ 2−5 = 0.78125=25/32

 

例:11/32轉化為二進位制

重複乘以2得積取1 
11/3211/16= 0+11/160
11/1611/8= 1+3/81
3/83/4= 0+3/40
3/43/2= 1+1/21
1/21/1= 1+01
二進位制結果0.01011  

? = 0.01011 = 1 ∗ 2−2 + 1 ∗ 2−4 + 1 ∗ 2−5 = 0.34375 = 11/32

 

 

 

 

 

2. 二進位制資料的表示方法

2.1 有符號數與無符號數

+表示正數,-表示負數

 

2.2 二進位制的原碼錶示法

image-20201113105943054

 

原碼錶示法特點

  1. 規定符號位位於數值第一位
  2. 使用0表示正數、1表示負數
  3. 表達簡單明瞭,是人類最容易理解的表示法

 

0在原碼中有兩種表示方法:00、10

原碼進行運算非常複雜,特別是兩個運算元符號不同的時候

 

 

2.3 二進位制的補碼錶示法

補碼的定義

image-20201113101511007

例子1:n=4,x=13,計算x的二進位制原碼和補碼

原碼:x=0,1101

補碼:x=0,1101

 

例子2:x=-13,計算x的二進位制原碼和補碼

原碼:x=1,1101

補碼:2?+1 + ? = 24+1 − 13 = 100000 1101 = 1 0011(高亮部分為符號位) 補碼:x=1,0011

例子3:x=-7,計算x的二進位制原碼和補碼

原碼:x=1,0111

補碼:2?+1 + ? = 24+1 − 7 = 100000 0111 = 1 1001 補碼:x=1,1001

 

例子4:x=-1,計算x的二進位制原碼和補碼

原碼:x=1,0001

補碼:2?+1~ + ? = 24+1 − 1 = 100000 0001 = 1 1111 補碼:x=1,1111

 

引進補碼的目的

  1. 使用加法代替減法操作,從而消除減法

  2. 減法運算複雜,希望找到使用正數替代負數的方法

    但在計算補碼的過程中,還是使用了減法!!


 

2.4 二進位制的反碼錶示法

反碼的定義

03

例子1:x=-13,計算x的二進位制原碼和反碼

原碼:x=1,1101

反碼:(2?+1−1) + ? = (24+1−1)− 13 = 011111 1101 = 1 0010(高亮部分為符號位) 反碼:x=1,0010

 

例子2:x=-7,計算x的二進位制原碼和反碼

原碼:x=1,0111

反碼:(2?+1−1) + ? = (24+1−1) − 7= 011111 0111 = 1 1000 反碼:x=1,1000

 

從以上兩個例子中可以看出按照定義求反碼依然有減法

 

引進反碼的目的

消除減法

 

通過以下規則求反碼可以消除減法的出現

負數的反碼等於原碼除符號位外按位取反

負數的補碼等於反碼+1

 

例子3:x=-7,計算x的二進位制原碼和反碼和補碼

原碼:x=1,0111

反碼:x=1,1000

補碼:x=1,1001

 

例子4:x=-9,計算x的二進位制原碼和反碼和補碼

原碼:x=1,1001

反碼:x=1,0110

補碼:x=1,0111


image-20201113104912542

 

2.5 小數的二進位制補碼錶示

二進位制小數的補碼定義

image-20201113105142340

 

負數的反碼等於原碼除符號位外按位取反

負數的補碼等於反碼+1

 

例子1:x= 9/16,計算x的二進位制原碼和反碼和補碼

原碼:x=0,0.1001 (重複相乘法)

反碼:x= 0,0.1001

補碼:x= 0,0.1001

 

例子2:x= -11/32,計算x的二進位制原碼和反碼和補碼

原碼:x=1,0.01011 (重複相乘法)

反碼:x=1,1.10100

補碼:x=1,1.10101


 

 

 

 

 

3. 二進位制資料的運算

3.1 定點數與浮點數

 

3.1.1 定點數的表示方法

定點數:小數點固定在某個位置的數稱之為定點數

image-20201118212510531

 

 

3.1.2 浮點數的表示方法

 

浮點數的表示格式

 

舉例引入:

123450000000 = 1.2345 × 1011(科學計數法)

1.2345:尾數

10:基數 11:階碼

 

浮點數的表示格式

S:尾數 , r:基數 , j:階碼

image-20201118213424272

舉例

11.0101 = 0.110101 × 210 11.0101 = 0.0110101 × 211

image-20201118213510860

 

 

 

 

 

浮點數的表示範圍

 

階碼錶示範圍: [−(?? − ?), ?? − ?]

尾數表示範圍: [−(? − ?−?), −(?−?)] [?−?, ? − ?−?]

image-20201118213906567

 

 

 

 

浮點數的規格化
  1. 尾數規定使用純小數
  2. 尾數最高位必須是1

 

舉例

123450000000 = 1.2345 × 1011

錯誤寫法:

image-20201118214058329

 

舉例

11.0101 = 0.110101 × 210

錯誤寫法:

image-20201118214207080

 

例子1:設浮點數字長為16位,階碼為5位,尾數為11位,將十進位制數 13/128表示為二進位制浮點數。

  • 利用重複相乘法求出原碼
  • 原碼=反碼=補碼:? = 0.0001101000

image-20201118214337933

 

例子2:設浮點數字長為16位,階碼為5位,尾數為11位,將十進位制數−54表示為二進位制浮點數。

  • 原碼: ? = 1,110110

image-20201118214412515

 

 

3.1.3 定點數與浮點數的對比

  1. 當定點數與浮點數位數相同時,浮點數表示的範圍更大
  2. 當浮點數尾數為規格化數時,浮點數的精度更高
  3. 浮點數運算包含階碼和尾數,浮點數的運算更為複雜
  4. 浮點數在數的表示範圍、精度、溢位處理、程式設計等方面均優於定點數
  5. 浮點數在數的運算規則、運算速度、硬體成本方面不如定點數

 

 

 

 

 

3.2 定點數的加減法運算

3.2.1 加法運算

整數加法:A[補] + B[補] = (? + ?)[補] (???2?+1)

小數加法:A[補] + B[補] = (? + ?)[補] (???2)

數值位與符號位一同運算,並將符號位產生的進位自然丟掉

 

例子1:A=-110010, B=001101,求A+B

A[補] = 1,001110

B[補]= B[原] = 0,001101

image-20201118220327186

A[補] + B [補]= (A + B) [補] =1,011011

A + B = −100101

數值位與符號位一同運算,並將符號位產生的進位自然丟掉

 

例子2:A=-0.1010010, B=0.0110100,求A+B

A[補] = 1,1.0101110

B[補] = B[原] = 0,0.0110100

image-20201118220445668

A[補] + B[補]= (A + B)[補] =1,1.1100010

A + B =-0.0011110

數值位與符號位一同運算,並將符號位產生的進位自然丟掉

 

例子3:A=-10010000, B=-01010000,求A+B

A[補] = 1, 01110000

B[補] = 1, 10110000

image-20201118220518078

A[補] + B[補] = (A + B)[補] =1,00100000

A + B =-11100000

驗證:A = −144, B = −80 , A + B = −224

數值位與符號位一同運算,並將符號位產生的進位自然丟掉

 

 

例子4:A=-10010000, B=-11010000,求A+B

A[補] = 1, 01110000

B[補] = 1, 00110000

image-20201118220843780

A[補] + B[補] = (A + B) 補 = 0,10100000

A + B = 10100000

驗證:

A = −144, B = −208, A + B = 160

數值位與符號位一同運算,並將符號位產生的進位自然丟掉

 

 

 

3.3.2 判斷溢位

  • 雙符號位判斷法

    • 單符號位表示變成雙符號位:0=>00, 1=>11
    • 雙符號位產生的進位丟棄
    • 結果的雙符號位不同則表示溢位

 

再來看例子4:A=-10010000, B=-11010000,求A+B

A[補] = 1, 01110000

B[補] = 1, 00110000

image-20201118221410615

image-20201118221518102

 

再來看例子3:A=-10010000, B=-01010000,求A+B

A[補] = 1, 01110000

B[補] = 1, 10110000

image-20201118221628551

image-20201118221718907

(A + B)[原] = 11,11100000 = −11100000

 

 

3.2.3 減法運算

整數減法:A[補] − B[補] = ? + (−?)[補] (???2?+1)

小數減法:A[補] − B[補] = ? + (−?)[補] (???2)

-B[補]等於B[補]連同符號位按位取反,末位加一

B[補] = 1,0010101

(−B)[補] = 0,1101011

 

例子5:A=11001000, B=-00110100,求A-B

A[補] = A[原] = 0,11001000

B[補] = 1,11001100

(−B)[補] = 0,00110100

A[補] − B[補] = A[補] + (−B)[補] = A + (−B)[補]

image-20201118222127656

A + (−B)[補] = 0,11111100

A − B = 111111100 (正數的補碼還是自身)

 

 

 

3.3 浮點數的加減法運算

 

? = ?? × ??? ? = ?? × ??y

操作流程

image-20201118231637730

 

 

3.3.1 對階

  • 浮點數尾數運算簡單
  • 浮點數位數實際小數位與階碼有關
  • 階碼按小階看齊大階的原則
  • 対階的目的是使得兩個浮點數階碼一致,使得尾數可以進行運算

 

舉例

? = 0.1101 × 201 , ? = (−0.1010) × 211, 求 x+y

image-20201118231740745

 

3.3.2 尾數求和

  • 使用補碼進行運算
  • 對於減法運算要轉化為加法運算:A - B = A + (-B)

image-20201118231921718

image-20201118231949399

 

 

3.3.3 尾數規格化(左移)

對補碼進行規格化需要判斷兩種情況:S>0 和 S<0

  1. S[補] = 00.1xxxxxx(? > 0)

  2. S[補] = 11.0xxxxxx(? < 0)

    符號位與最高位不一致

如果不滿足此格式,即符號位與最高位一致, 需要進行左移,同時階碼相應變化,以滿足規格化

 

image-20201118232341946

image-20201118232411391

因此:? + ? = −0.1110 × 210

 

 

3.3.4 尾數規格化(右移)

  1. 一般情況下都是左移
  2. 雙符號位不一致下需要右移 (定點運算的溢位情況)
  3. 右移的話則需要進行舍入操作

 

3.3.5 舍入

  • “0舍1入”法(二進位制的四捨五入)

 

例1:

S [補] = 10.10110111

S [補] = 11.01011011(1) 【1次尾數右移,記得階碼要+1哦】

image-20201118233056714

例2:

S [補] = 01.11111111

S [補] = 00.10000000(1)

image-20201118234956515

S [補] = 01.00000000

S [補] = 00.1000000(0)【兩次右規,記得階碼要+2哦】

 

3.3.6 溢位判斷

  • 定點運算雙符號位不一致為溢位
  • 浮點運算尾數雙符號位不一致不算溢位【因為尾數雙符號位可以進行右規】
  • 浮點運算主要通過階碼的雙符號位判斷是否溢位
  • 如果規格化後,階碼雙符號位不一致,則認為是溢位

 

例子:? = 0.11010011 × 21101,? = 0.11101110 × 21100,假設階碼4位,尾數8位,計算x + y

 

image-20201118233642586

image-20201118233656618

image-20201118233709618

image-20201118233738582

 

? + ?[原] = ? + ?[補] = 0.10100101 × 21110

 

 

 

3.3.7 浮點數的加減法運算總結

image-20201118233855044

尾數右移1位:階碼加1

尾數左移1位:階碼減1

 

 

 

 

3.4 浮點數的乘除法運算

這部分作為了解

 

? = ?? × ??? ? = ?? × ??y

乘法:階碼相加,尾數求積

? × ? = ( ?? × ?? ) × ?(??+?y)

除法:階碼相減,尾數求商

?/? = ( ?? / ?? ) × ?(??−?y)

 

操作流程

image-20201118234207111

 

 

例子:? = 0.11010011 × 21101,? = 0.11101110 × 20001,假設階碼4位,尾數8位,計算x * y

? × ? = ( ?? × ?? ) × ?(??+?y)

= (0.11010011 × 0.11101110) × ?1101+0001

= 0.11000100(保留八位) × ?1110

相關文章