一、补码加减法的运算方法
1. 补码加法
补码加法的运算:[x]补+[y]补=[x+y]补
例1:设x=0.1010,y=0.0101,求 [x]补+[y]补 。
先将真值x和y转换成由补码数据表示:
x[补]=0.1010,y[补]=0.0101
利用补码加法公式可得:
[x]补 0.1010
+[y]补 0.0101
[x+y]补 0.1111
所以:x[补]+[y]补=0.1111
例2:设x= -0.1010,y= -0.0100,求 [x+y]补 和 x+y 。
先将真值x和y转换成由补码数据表示:
[x]补=1.0110,[y]补=1.1100
利用补码的加法公式可得:
[x]补 1.0110
+[y]补 1.1100
[x+y]补 11.0010
符号位进位的值为模数,应该舍弃,所以:[x+y]补=1.0010,x+y= -0.1110
2. 补码减法
补码减法运算公式:[x-y]补=[x]补+[-y]补=[x]补-[y]补
例3:设x=0.1001,y=0.0110,求 [x]补-[y]补 。
[x]补=0.1001,[y]补=0.0110,[-y]补=1.1010
[x]补 0.1001
+ [-y]补 1.1010
[x-y]补 10.0011
符号位进位的值为模数,应该舍去,所以:[x]补-[y]补=0.0011
例4:设x= -0.1001,y= -0.0110,求 [x]补-[y]补 和 x-y 。
[x]补=1.0111,[y]补=1.1010,[-y]补=0.0110
[x]补 1.0111
+ [-y]补 0.0110
[x-y]补 1.1101
所以:[x]补-[y]补=1.1101,x-y= -0.0011
二、溢出及检测
1. 溢出的概念
我们通过两个实例来观察溢出的现象:
(1)设[x]补=0.1011、[y]补=0.1100,求[x]补+[y]补。
(2)设[x]补=1.0101、[y]补=1.0100,求[x]补+[y]补。
对于(1):两个正数相加,运算结果是负数,显然是错误的
[x]补 0.1011
+ [y]补 0.1100
[x+y]补 1.0111
对于(2):运算结果舍去了模数,两个负数相加结果成了正数,运算结果同样是错误的
[x]补 1.0101
+ [y]补 1.0100
[x-y]补 10.1001
由于计算机字长是确定的,能表示的数据范围也是有限的,溢出现象不可避免。而溢出很有可能导致有效数字丢失或直接导致错误的运算结果,因此,计算机系统设计者必须解决溢出的判断问题,以便溢出发生时计算机能做出相应的处理。
2. 溢出的检测
主要利用变形补码的符号位进行检测:
变形补码即用两个二进制位来进行数据的符号表示。正数的符号以“00”表示,负数的符号以“11”表示。一般称左边的符号位为第1符号位,右边的符号位为第2符号位,第1符号位永远代表正确的符号位。补码加减法的运算公式对变形补码仍然成立,若运算结果的符号位为“01”或“10”,则分别表明发生了正上溢和负上溢。
例1:设[x]补=00.1011,[y]补=00.0111,求[x]补+[y]补。
[x]补 00.1011
+ [y]补 00.0111
[x-y]补 01.0010
运算结果的符号位为“01”,第1符号位代表正确符号位,运算发生了上溢
例2:设[x]补=11.0101,[y]补=11.0011,求[x]补+[y]补。
[x]补 11.0101
+ [y]补 11.0011
[x-y]补 10.1000
运算结果的符号位为“10”,第1符号位代表正确符号位,运算发生了下溢
例2:设[x]补=00.1011,[y]补=11.0011,求[x]补+[y]补。
[x]补 00.1011
+ [y]补 11.0011
[x-y]补 11.1110
运算结果的符号位为“11”,运算未发生溢出
由此可见,当运算结果的双符号位相同时无溢出,相异时溢出。
不论是否溢出,第1符号位永远与真实的符号位一致。