原码加减运算
对原码表示的两个数进行加减运算时,符号位不参与运算,仅仅是两数的绝对值参与运算。计算机的实际操作是加还是减,不仅取决于指令的操作码,还取决于两个操作数的符号,例如:加法时可能要做减法(两数异号);减法时又可能做加法(两数异号),所以原码加减运算的实现是比较复杂的 。
补码加减运算
1.补码加法
两个补码表示的数相加,符号位参加运算,且两数和的补码等于两数补码之和,即
[X Y]补=[X]补 [Y]补
2.补码减法
根据补码加法公式可推出:
[X-Y]补=[X (-Y)]补=[X]补 [-Y]补
已知[Y]补求[-Y]补的方法是:将[Y]补连同符号位一起求反,末尾加“1”。 [-Y]补被称为[Y]补的机器负数,由[Y]补求[-Y]补的过程称为对[Y]补变补(求补),表示为:
[-Y]补=[[Y]补]变补
注意将“某数的补码表示”与“变补”这两个概念区分开来。一个负数由原码表示转换成补码表示时,符号位是不变的,仅对数值位的各位变反,末尾加“1”。而变补则不论这个数的真值是正是负,一律连同符号位一起变反,末尾加“1”。[Y]补表示的真值如果是正数,则变补后[-Y]补所表示真值变为负数,反之亦然。
3.补码加减运算规则
补码加减运算规则如下:
(1)参加运算的两个操作数均用补码表示;
(2)符号位作为数的一部分参加运算;
(3)若做加法,则两数直接相加;若做减法,则将被减数与减数的机器负数相加;
(4)运算结果用补码表示。
4.符号扩展
在计算机算术运算中,有时必须将采用给定位数表示的数转换成具有更多位数的某种表示形式。例如某个程序需要将一个8位数与另外一个32位数相加。要想得到正确的结果,在将8位数与32位数相加之前,必须将8位数转换成32位数形式,这被称为“符号扩展”。
对于补码,符号扩展方法是:原有符号位保持不变,若为正数则所有附加位都用0进行填充,若为负数则所有附加位都用1进行填充。也可以理解为是用符号位来填充附加的高位 。
补码的溢出判断与检测方法
1.溢出的产生
在补码加减运算中,有时会遇到这样的情况:两个正数相加,而结果的符号位却为1(结果为负);两个负数相加,而结果的符号位却为0(结果为正)。
设参加运算的两数为X、Y,做加法运算。
若X、Y异号,不会溢出。
若X、Y同号,运算结果为正且大于所能表示的最大正数或运算结果为负且小于所能表示的最小负数(绝对值最大的负数)时,产生溢出。将两正数相加产生的溢出称为正溢;反之,两负数相加产生的溢出称为负溢。
2.溢出检测方法
设:被操作数为:[X]补=Xs,X1X2…Xn
操作数为:[Y]补=Ys,Y1Y2…Yn
其和(差)为:[S]补=Ss,S1S2…Sn
(1)采用一个符号位
两正数相加,结果为负表明产生正溢;两负数相加,结果为正表明产生负溢。因此可得出采用一个符号位检测溢出的方法:
当Xs=Ys=0,Ss=1时,产生正溢。
当Xs=Ys=1,Ss=0时,产生负溢。
(2)采用进位位
两数运算时,产生的进位为Cs,C1C2…Cn,其中:Cs为符号位产生的进位,C1为最高数值位产生的进位。
两正数相加,当最高有效位产生进位(C1=1)而符号位不产生进位(Cs=0)时,发生正溢。
两负数相加,当最高有效位没有进位(C1=0)而符号位产生进位(Cs=1)时,发生负溢。
(3)采用变形补码(双符号位补码)
在双符号位的情况下,把左边的符号位Ss1叫做真符,因为它代表了该数真正的符号,两个符号位都作为数的一部分参加运算。这种编码又称为变形补码。
双符号位的含义如下:
Ss1Ss2=00 结果为正数,无溢出;
Ss1Ss2=01 结果正溢;
Ss1Ss2=10 结果负溢;
Ss1Ss2=11 结果为负数,无溢出。
当两位符号位的值不一致时,表明产生溢出。溢出=Ss1⊕Ss2 。