*1.7 带符号二进制数的表示法
一个二进制数可以表示为正数或者负数,方法是在二进制数最高位之前加一个符号位,用0表示正数,1表示负数,通常用逗号将符号位隔开。
1.7.1 二进制正数表示法
正数的原码表示法、反码表示法和补码表示法相同,均为符号位0加二进制数本身(即原码)。例如,(+37)10=0,100101。
1.7.2 二进制负数表示法
二进制负数的三种表示方法各有不同,规则如下。
原码表示法:符号位1加原码。
反码表示法:符号位1加反码。
补码表示法:符号位1加补码。
例如,(37)10的二进制数为100101,(-37)10的三种二进制表示法分别如下。
原码表示法:1,100101
反码表示法:1,011010
补码表示法:1,011011
1.7.3 带符号二进制数的运算
在数字电路系统中,为了简化运算电路,减法运算用补码相加来完成,乘法运算用加法和移位来实现,除法运算用减法和移位来完成。因此,加法运算是数字电路的基本运算单元。例1.12~例1.14说明了如何利用补码运算将减法化为加法来完成计算。
【例1.12】用二进制补码运算求(1101)2-(1010)2。
解:采用补码运算,首先化为带符号数相加的形式
(1101)2-(1010)2=(0,1101)2+(1,1010)2
对两数求补
[(0,1101)2]补=0,1101 [(1,1010)2]补=1,0110
然后两个补码相加并舍去进位
0,1101+1,0110=(1) 0,0011=0,0011
这仍是计算结果的补码形式。对此结果再求一次补,得到计算结果的原码
(0,0011)补=0,0011
所以(1101)2-(1010)2=(0,0011)2。
【例1.13】用二进制补码运算求(13)10-(25)10。
解:(13)10表示成补码为(0,01101)2,(-25)10表示成补码为(1,00111)2。
将两个补码相加,(0,01101)2+(1,00111)2=(1,10100)2。
这仍是计算结果的补码形式。对此结果再求一次补,得到计算结果的原码
(1,10100)补=(1,01100)2=(-12)10
【例1.14】用二进制补码运算求(-13)10-(25)10。
解:(-13)10表示成补码为(1,10011)2,(-25)10表示成补码为(1,00111)2。
将两个补码相加,(1,10011)2+(1,00111)2=(10,11010)2。由于两个被加数都是6位的(包括符号位),运算结果也应该是6位的。所以,(10,11010)2的最高位溢出,运算结果为(0,11010)2。此数是一个正数,显然运算结果是错误的。
(-13)10-(25)10的运算结果应该是(-38)10。用二进制表示至少用7位数字(包括符号位)。可见,出错的原因是参与运算的字长不足。解决办法是增加字长,在两个被加数的原码最高位加一个0,再按相同方法继续运算,过程如下。
用7位数字表示(-13)10,原码为(1,001101)2,补码为(1,110011)2。同理,(-25)10的原码为(1,011001)2,补码为(1,100111)2。两个补码相加,(1,110011)2+(1,100111)2=(11,011010)2,高位溢出后为(1,011010)2。
这仍是计算结果的补码形式。对此结果再求一次补,得到计算结果的原码
[(1,011010)2]补=(1,100110)2=(-38)10