补码加、减运算规则
在計算機中,通常總是用補碼完成算術的加減法運算。其規則是:
[X+Y]補= [X]補 + [Y]補 ,[X-Y]補= [X]補 - [Y]補 = [X]補 + [-Y]補
這表明,有了補碼表示的被加(減)數和加(減)數,要完成計算補碼表示的二數之和或二數之差,只需用二數的補碼直接執行加減運算即可,符號位與數值位同等對待,一起參加運算,若運算結果不溢出,即不超出計算機所能表示的范圍,則結果的符號位和數值位同時為正確值。此外,還可以看到,實現減運算時,用的仍是加法器線路,把減數的負數的補碼送加法器即可。在有了一個數的補碼之后,求這個數的負數的補碼,是簡單地把這個數的補碼逐位取反再在最低位加1即可得到。例如,[Y]補=101101,則[-Y]補=010011,這大大簡化了加減運算所用的線路和加減運算的實現算法。
下面的問題是如何檢查加減運算中的溢出問題。通常有三種表述方式(說法):
(1) 兩個符號相同的補碼數相加,如果和的符號與加數的符號相反,或兩個符號相反的補碼數相減,差的符號與減數的符號相同,都屬于運算結果溢出。這種判別方法比較復雜,要區別加還是減兩種不同運算情況,還要檢查結果的符號與其中一個操作數的符號的同異,故很少使用;
(2) 兩個補碼數相加減時,若最高數值位向符號位送的進位值與符號位送向更高位的進位值不相同,也是運算結果溢出。
(3) 在采用雙符號位(如定點小數的模4補碼)運算時,若兩個符號位的得值不同(01或10)則是溢出。01表明兩個正數相加,結果大于機器所能表示的最大正數,稱為"上溢";10表明兩個負數相加,結果小于機器所能表示的最小負數,稱為"下溢";雙符號位的高位符號位,不管結果溢出否,均是運算結果正確的符號位,這個結論在乘法運算過程中是很有實際意義的。請注意,在采用雙符號位的方案中,在寄存器和內存儲器存儲數據時,只需存一位符號,雙符號位僅用在加法器線路部分。
再次強調,這三種不同說法是對同一個事實的略有區別的表述,實現時用到的線路可以有所區別,但問題的實質是完全一樣的。請看 [X]補 + [Y]補 的運算情況:
01011 10101 10100
+ 01000 + 11000 + 11001
_______________________________________
10011 101101 101101
(1) (2) (3)
10111 001011 110111
+ 10101 + 001000 + 110101
101000 010011 1101100
(4) (5) (6)
這全都是溢出情況,前4個使用一個符號位,后2個使用二個符號位。用前面說的任何一種表述解釋這里的溢出都是可以的。例如,對于(1),從正加正的得負,或數據位向符號位送的進位值為1,而符號位送向更高位的進位值卻為0,二者不相同,或在(5)中使用雙符號位方案時,其雙符號位結果為01,都是運算結果溢出。
凡補碼加減運算其結果不屬于上述情況的,均不是溢出,結果的符號位和數值位均正確。這里雖然討論的都是加法運算,對減運算亦適用。正減負等同正加正,正減正等同正加負,正如前面說過的,減運算也是用加法器完成的。例如:
01011 11101 001011 111101
+ 00100 + 11010 + 000100 + 111010
01111 10111 001111 110111
(1) (2) (3) (4)
(1)、(2)使用一位符號位,(3)、(4)使用二位符號位,符號位送向更高位的進位值,不論其值為0或為1一律在取模后丟棄。
有了上述說明,就可以用圖2.5的邏輯線路完成二補碼數的加減運算。
運算前,X、Y寄存器分別存儲被加(減)數 和 加(減)數,計算結果存回X寄存器;F為加法器,能在命令X→F和Y→F信號的控制下接收兩個寄存器中的數據并完成加法運算,運算結果在F→X命令信號的控制下接收回X寄存器中。
為實現減運算,應將Y寄存器中補碼數據的負數表示送到加法器F,這可以通過送Y寄存器中每位數據的反碼并在F的最低位給出進位1輸入信號變通完成,用/Y→F和1→F控制命令實現。
總結
- 上一篇: html ul变成三角形,用CSS来画空
- 下一篇: Python基础 | 快速实现label