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