1. 程式人生 > >IA-32中的數值運算

IA-32中的數值運算

1、IA-32中的整數運算

  • 整數加減法運算

記憶體中整形數是以補碼的形式儲存在記憶體中:

原碼錶示範圍:負數部分:1111 1111(-127)~1000 0000(-0);正數部分:0000 0000(+0)~01111111(127)

補碼錶示範圍:負數部分:1000 0001(-127)~11111111(-1);正數部分:0000 0000(+0)~0111 1111(127)

其中,原碼中的1000 0000(-0)用來表示補碼中的最小負數1000 0000(-128),所以補碼相比於原碼多表示一個最小負數。

邏輯電路中的加法器實現:

對於加法運算:

邏輯選擇部件mux的輸入SUB訊號為0,CIN訊號為0,選擇B作為輸出。

對於減法運算:

邏輯選擇部件mux的輸入SUB訊號為1,CIN訊號為1,選擇非B作為輸出。

標誌位:

OF = Cn xor Cn-1

SF = Fn-1

CF = CIN xor Cn

ZF = F0 and F1 ~Fn-1

整數加減法的溢位:

無符號加溢位條件:最高位進位,數值超出表示範圍,即CF =1;帶符號加法溢位條件:兩個正數相加結果為負,即OF =1。

無符號減溢位條件:CF =1;帶符號減溢位條件:OF =1。

程式中的溢位判斷:


  • 整數乘法運算

高階語言中兩個正數相稱得到的結果通常也是一個n為整數,所以結果只取低n位

C語言程式設計中計算:

int z = x * y

其中彙編上述指令轉換為機器碼後,在乘法運算電路中得到的乘積是64位,但是高階語言只取低32位賦值

乘法運算的溢位判斷:

無符號數乘積:若高位全0,則不溢位,否則溢位

帶符號數乘積:若高位全0或全1且等於低n位的最高位,則不溢位,否則溢位

對於組合語言,也就是計算機指令,乘法指令不置標誌位,也就是不通過標誌位來判斷乘法是否溢位。所以要通過2n為乘積來判斷溢位。

組合語言中,乘法指令分為無符號乘指令、帶符號乘指令。

整數乘法運算相比移位與加法運算所用時間長,通常一次乘法運算需要多個時鐘週期,而一次移位、加法運算和減法運算只要一個或者更少的時鐘週期,因此編譯器在處理變數與常數相乘是,往往以移位、加法和減法的組合來替代乘法運算。

不管是無符號還是帶符號整數乘法,即使乘積溢位時,利用移位和加減法運算組合的方式帶到的結果都是和採用直接相乘的結果是一樣的。

例:表示式 x*20 除了可以利用乘法器來運算外,還可以通過移位器和加法器來運算:

x * ( 2^4 + 2^2) = x << 4 + x << 2

  • 整數除法運算

對於整數除法,因為商的絕對值不可能比被除數的絕對值大,因而不會發生溢位,也就是不會像整數乘法那樣發生整數溢位漏洞。除了一個例外:

-2^(n-1)/-1 = 2^(n-1) 用補碼最小負數除以-1,結果為2^(n-1),超出nbit數的最大表示範圍。

除法運算的舍如規則:

整數除法中,商也是整數,所以在不能進行整除是需要進行舍入,通常按照超0的方向舍如,也就是整數商取比自己小的整數,負數商取比自己大的整數。

對於整數除法運算,由於計算機中除法運算比較複雜而且不能用流水線實現,所以一次除法運算大致需要30個或更多個時鐘週期,比乘法指令的時間還長。
編譯器在處理一個變數與一個2的冪次形式的整數相處時,常採用右移和演算法數加減的運算來實現

無符號:邏輯右移

帶符號:算數右移(邏輯移位+補符號位)

2、浮點數運算

計算機中浮點數採用IEEE 754 標準規定的形式儲存在記憶體中。

對於32位的單精度浮點數(float):

1位符號位,8位階碼(移碼錶示,偏置常數為128),23位尾數(原碼錶示,第一位預設1不明顯表示,所以可以表示24位尾數)

對於64位的雙精度浮點數(double):
1位符號位,11位階碼,52位尾數

對於92位或者128位拓展精度浮點數(lonfg double):

只用低80bit來表示浮點數,高12位無意義

我們用單精度浮點數來說明問題:
在浮點數中,0也存在浮點數的表示形式:
浮點數+0:符號位為0,階碼和尾數全為0;

浮點數-0:符號位為1,階碼和尾數全為0。

相比於整形數,浮點數還可以表示正無窮和負無窮:
需要特別說明的是:浮點數除以0的結果 +/-無窮,而不是溢位異常(整數除0為異常)。
正無窮:符號位為0,階碼全為1,尾數全為0;
負無窮:符號位為1,階碼全為1,尾數全為0。

浮點數的中的“非數”表示:階碼全為1,尾數不全為0

浮點數運算的溢位:
階碼上溢:階碼超出了最大表示範圍,階碼全為1,表示正/負無窮數

階碼下溢:階碼超出了最小表示範圍,階碼全為0,表示+/-0

浮點數加減運算:浮點數在記憶體中右符號位、階碼、尾陣列成,其中階碼錶示浮點數的表示範圍,尾數表示浮點數的表示精度。在浮點數加減運算,在進行對階操作後,直接對兩個運算元進行加減運算。

尾數加法:在尾數原碼的基礎上直接相加;

尾數減法:在尾數原碼的基礎上,被減數B取反經過二選一選擇器傳入加法器,SUB也就是CIN訊號傳入1參與計算。