原码不能直接参加运算,可能会出错。例如在数学上,1 + (-1) = 0, 而在二进制中 0000 0001 + 1000 0001 = 1000 0010,换算成十进制为130 ≠ 0 。显然是错的。
所以计算机中数值一律用补码来表示。
计算机补码加减及溢出
想要了解掌握补码,应先知道其运算规则:
-
【X+Y】补 = 【X】补 +【Y】补
-
【X-Y】补 = 【X】补 +【-Y】补
例一:
用补码求 【 X - Y 】补
若:【X】补 = 0010 0101
【-Y】补 = 1100 1101
【X-Y】补 = 【X】补 +【-Y】补 = 0010 0101 + 1100 1101 = 1111 0010
另外提两点,结果得符号位 0 为正数,【X-Y】补 =【X-Y】原码 ,符号位为 1 为负数,【【X-Y】补 】补 = 【X-Y】原码
本例中【X-Y】补 = 1111 0010 ,符号位为 1 为负数,所以【【X-Y】补 】补 =【X-Y】原码 。
上述补码运算结果是正确的,但有时在补码运算过程中也会出现错误的计算。
例二:
设 X = +100 , Y = +50 ,用补码运算求解X+
Y 。
【X】补 = 0110 0100 【Y】补 = 0011 0010
【-X】补 = 1001 1100 【-Y】补 = 1100 1110
【X+Y】补 = 0110 0100 + 0011 0010 = 1001 0110
【X+Y】原码 = 【【X+Y】补 】补 = 1110 1010
X+Y = -(0110 1010)= -106 ≠ (+100) + (+50)
溢出的判别
计算机中判别溢出的方法通常采用双高位判别法。双高位判别法利用符号位(K n-1 位)及最高数值位(K n-2 位)的进位情况来判断是否发生了溢出。为此,需引进两个符号::Cs 和 Cp.
Cs:若符号位发生进位,则Cs = 1; 否则Cs = 0
Cp:若最高数值位发生进位,则Cp = 1;否则Cp = 0
● 当两个正数补码相加时,若数值部分之和大于2n-1,则数值部分必有进位Cp= 1;而符号位却无进位Cs = 0。这时CsCp的状态为 “ 01 ” 发生正溢出。
● 当两个负数补码相加时,若数值部分绝对值之和大于2 n-1 ,则数值部分补码之和必小于2 n-1, Cp = 0;而符号位肯定有进位Cs = 1,这时CsCp的状态为 “10“”, 发生负溢出。
● 当不发生溢出时,Cs和Cp的状态是相同的,即Cs Cp的状态为 “00” 或 “11” 。
例三:
① 1001 0010 (-110) ② 1110 1100 (-20)
+ 1010 0100 (-92) + 1110 0010 (-30)
—————————————— ——————————————————
1 0011 0110 (+54) 1 1100 1110 (-50)
Cs = 1,Cp = 0, ==负溢出 Cs = 1, Cp = 1,==无溢出
综上所述,对计算机而言,补码的引入使带符号数的运算都按加法处理。如果Cs和Cp的值相等,则表示运算结果正确,没有溢出。如果Cs和Cp的值不等,则表示运算结果不正确,发生了溢出现象。