双符号位加减问题
双符号位表示正数是00,负数是11,因为采用了两位符号位,肯定多了信息,实际上是可一将第二位符号位看做原来单符号位表示法里的符号位。
1.单符号位判断溢出
方法:判断符号进位位Cs和最高数位进位位C1,相同则没有溢出,不同则存在溢出;
例如 -0.001 补码:1.111
+ -0.001 补码:1.111
———————————————
-0.002 补码:(1)1.(1)110
如图,括号内即分别为符号位进位位和最高位进位位的值,可见是相同的,并且将补码转换后转成真值,可知数据没有出错,没有溢出;同时也可以这么想,即最高位为两个1,则其实是原码取反加一得来的,要么是原码最高位上本来为0,即为-0.0xx-0.0xx,结果总不会溢出;要么是原码为-0.100,取反加一可得是1.100,此时
-0.100 补码:1.100
+ -0.100 补码:1.100
———————————————
-0.002 补码:(1)1.(1)000
此时可以看出,两个进位位都是一,相同,所以没有溢出,同时可以看到结果是机器数的-0,用补码转换时不用再取反加一,因为其刚好是补码中的特殊值-1,这里可见补码中用-0多表示一个-1是正确的。
2.双符号位判断溢出
双符号位多了一位,因此在溢出的情况下并没有因为溢出而丢失信息,保存在了多的位中,比如正溢出后的值通过加上一个负数的补码还可以再减回去并得到正确的值