計算機加減乘除及溢出情況(定點數)


鏈接:《深入理解計算機系統》第二章:整數的運算_Turbo碼先生-CSDN博客

機器數及運算表示全部使用補碼

定點數:

參考鏈接:

  https://blog.csdn.net/limanjihe/article/details/52440544

漫談計算機組成原理(九)定點數及定點數的運算 - 雲+社區 - 騰訊雲 (tencent.com)

定點數的位移運算

移位運算的規則:雖然正數和負數的移位運算規則不相同,但是相同之處在於移位后正數和負數的符號不變。那么規則就變成了移位運算時,符號位不動,數值位按照如下規則進行移位。

 

 

 

無符號整數

溢出情況:(有且僅有正溢出)超出最大表達范圍即溢出

例:8位機器數 表達范圍:0-255  如果計算的結果超過了這個范圍,則會出現溢出現象,最高位無法表達,導致比其中一個加數小

帶符號整數

溢出情況:

如何判斷有符號數是否發生溢出現象:
1、兩個正數相加得到一個負數,則說明發生了正溢出
2、兩個負數相加得到一個正數,則說明發生了負溢出

正溢出:

兩正數的數值部分相加產生進位到符號位,導致最終的得到的數是負數,導致出現錯誤

例:127 + 1 = 128 機器數表示 :0111,1111 + 0000,0001 = 1000,0000

負溢出:

例:-128 + -1 = -129 機器數表示 1000,0000 + 1111,1111 = 1,0111,1111(第一位舍去無法表示)

溢出判斷方法:(溢出只可能兩個正數相加或者兩個負數相加)

(1)用一位符號位判斷溢出:判斷結果的符號位是否與兩個操作數的符號位相同,如果不同,則發生溢出

(2)利用數據編碼的最高位(符號位)和次高位(數值部分的最高位)的進位狀況來判斷運算結果是否發生了溢出:

如果進位情況是00,則無溢出;為01,則發生溢出; 為10,則發生溢出;為11,則無溢出

(3)采用雙符號位補碼進行判斷:

正常時兩個符號位的值相同,在運算結果中當兩個符號位不同時則表明發生了溢出。運算結果的符號位為01表明兩個正數相加,結果大於機器所能表示的最大正數,稱為上溢;運算結果的符號位為10表明兩個負數相加,結果小於機器所能表示的最小負數,稱為下溢。也就是說,兩個正數相加,數值位不應向符號位同時產生進位,使得結果數的符號位和操作數的一樣,為00

例子:

(-10)+(-7)=(-17)

用機器數表示為 11 0110 + 11 1001 = 10 1111 發生溢出

 3 + 2 = 5

用機器數表示為00 0011 + 00 0010 = 00 0101

 

乘法:

乘法相當於變為移位運算和求和運算,相當於將乘數B從低位到高位乘下來,部分積從零開始累加,並且右移一位(相當於乘了個1/2)

(注意,符號位相當於進行了異或運算,相同為0,相異為1,不參與后面的數值部分計算)

原碼乘法:

 

補碼乘法:Booth算法(被乘數,乘數符號任意) 一般用於帶符號數乘法

這個的原理證明還是慢慢看吧,先大概把怎么用搞懂

計算規則:

 

A補 指累加的部分積

例:

 

 x = -0.1101  y = -0.1011

A = 00.0000 ,B = [x]補 = 11.0011  -B = -[x]補 = 00.1101    C = [Y]補 = 1.0101

在第一步之前,需要在C的最低位補上一個0(為什么),使得C = 101010

第一步

 判斷C中最低兩位的數 10,所以減去B,等於加上-B

此時A = 000000+001101=00 1101       C = 10 1010 (先不動,后面統一右移)   右移操作:

由於是雙符號位表示,則需要將A中第二符號位右移,使其先暫時保持空缺,同時A中最低位右移到C最高位,如圖所示

 

對A而言,當前是補碼正數,所以在空缺的位置補0

第二步:判斷C中最低兩位的數,01,所以+B

A = 000110 + 110011 = 111001   C = 110101

整體右移一位: A此時是補碼負數,所以在空缺位置補1

 

 

 

第三步:

 

  判斷C中最低兩位的數 10,所以減去B,等於加上-B

 A = 111100 = 001101 = 1 001001    C = 111010

這個地方1 是超出范圍的,1不計,再整體右移

這里A為補碼正數,所以在空缺位置補0

 

 

第四步 

 判斷C中最低兩位的數,01,所以+B 

A= 000100 + 110011 = 110111  C= 111101

整體右移,然后A補1 

 

 

共四次循環,

開始校正: 此時C最低兩位為10,因此要-B

A = 111011 + 001101 = 1 001000(最高位舍去)     C = 111110 ,這個時候不需要移位了

考慮到乘數C的底兩位只是用來參考位判斷,所以只取C的前四位

最后得 z = 001000 1111 由於最高得兩位是符號判斷位,所以最終

z = + 0.1000 1111

 

除法:

原碼恢復余數法:

規則:將被除數-除數,
結果大於0,商1,余數左移一位。
結果小於0,商0,恢復余數,余數左移一位。
重復上述操作,直至商的精度滿足要求為止。

本質上來說,不恢復余數法是只是為了在計算的時候能夠不判斷除數和余數的大小而規定的一種算法,每一次只需要先減就是了,減完了以后,再通過雙符號位判斷上商為0還是1,然后再判斷是否要恢復余數

參考鏈接:考研計組 | 原碼(不)恢復余數除法、補碼不恢復余數除法_⊳ideal world⊲~ヽ(゚︺゚)Hi-CSDN博客_不恢復余數法

 

原碼不恢復余數法:

與恢復余數法的區別:
若余數(被除數)為負,表示不夠減,商上0,恢復余數(加上除數) ,左移一位,加上[-y]_補 , 加上[ y ] 補 [y]_補[y]  鏈接同上

 

 

補碼除法:

 

 

例子:(必須滿足被除數絕對值小於除數絕對值)

x / y = + 0.1000 / (-0.1010) = ?

R = X[補] = 00 1000       B=Y[補] = 110110       -B = 001010        商Q= 00000

步驟:

因為余數在每次運算后都要被不斷置為被除數,所以初始化r = X【補】

第一步:

當前余數是正數,是雙符號位,而Y的補碼是負號,所以需要上商為0,然后向左移動余數和商各一位,因為是補碼的雙符號位移位, 其中,余數最高位移動到第二符號位,商的最高位移動到余數最低位,然后進行+B的操作

 得到 R = 01 0000 + 11 0110 = 1 000110      然后將 被除數賦值給余數 得到  r = 000110       Q = 00000

 

 


第二步:

當前除數和r1異號,因此在Q末尾上0, 然后向左移動余數和商各一位,  其中,余數最高位移動到第二符號位,商的最高位移動到余數最低位,然后進行+B的操作

得到R = 001100 + 110110 = 1 000010    然后將 被除數賦值給余數 得到  r = 000010  Q = 00000

 

 

第三步:

同上,商繼續上0 ,基本操作同上:得

R = 111 010    商 Q = 00000

 

 第四步:

因為余數和y補同號, 所以上商1 ,然后整體左移一位,按照之前的規則上位,並且-B(相當於+【-B】補碼)

得 余數 = 111110,  商Q = 0001

 

 除數的位數只有四位,因此循環完成:

商校正:商的最高位+1(取反),最低位置1, 最終得到 Q = 10010

余數校正:余數在運算過程中左移了四位,因此需要將其縮小到原來的 2^(-4), 最終得到r = 2^(-4) * r4

 

浮點數

鏈接:計算機組成原理——浮點數的加減法_豪滿天下的博客-CSDN博客

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM