1. 程式人生 > >計算機組成與設計(3)-----算術運算

計算機組成與設計(3)-----算術運算

思維導圖

本文主要包括整數和浮點數的算術運算,他們都是被名為算術邏輯單元的硬體實現

一.整數運算

1.1加法

二進位制數的加法採用從右到左將對應的位同進位依次相加的方式實現

//模擬二進位制5+7的實現(16位)
0000 0000 0000 0101            //5
0000 0000 0000 0111            //7
            
               0111            //進位,同左邊一位的和相加
---- ---- ---- ----
0000 0000 0000 1100            //12

二進位制加法會在兩個正整數相加,或者兩個負整數相加是出現溢位,即所得的和超出了32位可以表示的最大數和最小數.如果是有符號數則會爆出異常,因為無符號數通常表示地址,所以會被忽略.

1.2減法

二進位制的減法有兩種實現方式,一種是直接相減,另一種是加上被減數的相反數的二進位制補碼

//模擬7-5(16位)

//直接相減
0000 0000 0000 0111            //7
0000 0000 0000 0101            //5
---- ---- ---- ----
0000 0000 0000 0010            //7-5=2

//加上被減數的相反數的二進位制補碼
0000 0000 0000 0111            //7
1111 1111 1111 1011            //-5的二進位制補碼(5求反後+1)
1111 1111 1111 1111            //進位
---- ---- ---- ----
0000 0000 0000 0010            //7-5=2

同二進位制加法一樣,減法在正數減負數或者負數減正數時也會發生溢位.有符號數會爆出異常,無符號數會被忽略.

1.3乘法

一個乘法語句的組成是被乘數*乘數=積.其在計算機中的實現原理同手工計算乘法的原理相同(現在只考慮正整數)

//算術邏輯單元計算乘法的原理
//模擬8*9(4位)

    1001            //9
    1000            //8
    ----
    0000            //乘數左邊第一位乘以乘數
   0000             //乘數左邊第二位乘以乘數
  0000              //乘數左邊第三位乘以乘數
 1001               //乘數左邊第四位乘以乘數
--------            //四個積的和就是此乘法的積
 1001000            //8+64=72
  • 下圖是最原始的乘法算術邏輯單元

對於運算元的每一位的三個基本執行步驟:乘數的最低為(乘數的第0 位)決定了被乘數是否被加到積暫存器上。第二步中的左移起著將被乘數左移的作用。第三部中後的有一給出了下一個迭代中要使用的乘數位。這三個步驟重複執行32次才獲得積。假設每個步驟花費一個時鐘週期,那麼100個時鐘週期才可以完成兩個32位數的相乘

  • 以上算術邏輯單元還可以進行優化

在這個乘法算術邏輯單元中,乘數暫存器被取消,乘數被放在乘積暫存器的右半部分,每做完一位的積並加在乘積暫存器上後,乘積暫存器就會右移一位.最後得到乘積.

還有一種更快的乘法算術邏輯單元

快速的乘法運算的主要思想是為乘數的每一位提供一個32位加法器,一個用來輸入被乘數和一乘數位相與的結果,另一個是上一個加法器的輸出.這樣叫可以通過log2(32)=5次加法時間得到乘積,而不是等待32次加法時間

  • 最後,如果乘法之中有負數時,會將負數轉化為正數,然後記錄其符號,得到乘積後,如果符號相異則為負數,反之則為正數.

1.4除法

  • 除法邏輯單元的計算原理也同手工計算除法一樣
//除法的計算原理

//模擬74/8=9...2
         1001     //商 9
     ________             ________
1000 |1001010     //除數8 |被除數74
     -1000
     --------
         1
         10
         101
         1010
        -1000
        -----
           10     //餘數2
  • 首先是最原始的除法算術單元

被除數會被放在餘數暫存器的右半部分,而除數則會被放在除數暫存器的左半部分.每次都會讓餘數減去除數,若>0則將商左移一位,置位1,<0便置為0並回復餘數暫存器的值.

  • 除法算術單元也可以進行優化

優化原理同乘法的優化差不多.將被除數放在餘數暫存器的右半部分,每次使用餘數暫存器的左半部分同除數暫存器進行比較,若餘數暫存器的值較大,則將餘數暫存器左移並置最低位為1,否則置為0.

最後,有符號除法的處理方式同有符號乘法相同.記住符號,並將負數轉化為正數,最後決定商的符號.特別的是,餘數的符號被規定為 同被除數的符號相同.這樣可以避免同一個除法商的值不一致的問題.例如-7 / 2 = -3...-1 也可以= -4...1

二.浮點運算

2.1二進位制同十進位制的轉化

因為計算機底層都是對二進位制數進行處理,所以,知道二進位制同十進位制之間是如何轉化的非常必要,這篇文章寫得很好,可以看看

2.1浮點數的表示方法(單精度)

我們首先約定浮點數的表示方法:

  • 科學計數法:小數點左邊只有一位整數的計數方法
  • 規格化數:沒有前導0,即小數點左邊的整數不會是0
  • 基數:同十進位制的科學計數法的基數為10,使小數點左移右移,二進位制的基數為1*2^(-1)

所以,浮點數就是二進位制小數點不固定的表達數的計數法.實際上的小數可以是無限的,但是,計算機中的小數因為物理原因限制,是有長度的,所以,浮點數也會發生上溢或者下溢.

二進位制浮點數的表示格式有符號位,尾數,指陣列成:

  • 符號位:表示此二進位制浮點數的符號,可以快速比較兩個浮點數的大小,佔1位即1bit
  • 指數:指數表示浮點數的的指數大小是多少,佔8位.為了能夠快速的比較兩個浮點數的大小,指數位會使用偏階,即指數的值減去127才是真正的指數大小.如果不使用偏階的話,因為補碼的原因,負數會很大,而整數很小.
  • 尾數:表示表示浮點數的小數部分,佔23位.因為浮點數的表示是規格化數,會自動設定一個前導值1,即浮點數的實際小數部分=1+尾數(尾數的大小在0和1的開區間之中),這樣做可以使精度擴大.

舉例:-0.75(十進位制)是如何表示的

首先十進位制轉化為二進位制=-0.11(二進位制)=-1.1 * 2^(-1)=-(1 + 0.1) * 2^(-1)

所以,其二進位制浮點數的表示為

-0.75(十進位制)的二進位制浮點數表示方法


1                                 //符號位為1,表示負數 
0111 1110                         //指數位為127,實際浮點數的指數位126-127=-1
1000 000 ...(共22個0)             //小數位0.1,實際浮點數為1+0.1=1.1
//綜合-0.75的二進位制表示為
1011 1111 0100 0000 0000 0000 0000 0000

2.2加減法

浮點數的加減法有一定的步驟.主要分為:指數對齊>>>有效數相加>>>格式化>>>舍入,具體如下

2.3乘除法

浮點數的乘除法也有一定的步驟:求指數>>>有效數相乘>>>格式化>>>舍入>>>定符號

以上說的都是單精度浮點數,雙精度浮點數不同於單精度浮點數的地方在於其有11位指數,52位尾數位,其偏階是1023.

2.4浮點運算的指令

浮點運算會使用全新的32個暫存器$f0-$f31

具體指令