补码加、减运算规则
在计算机中,通常总是⽤补码完成算术的加减法运算。其规则是:两个负数的补码相加
  [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控制命令实现。