看计算机组成,遇到这样一道题:
例题:
两个同符号的数相加或异符号的数相减,所得结果的符号位SF和进位标志CF进行__D__运算为1时,表示运算的结果产生溢出。
A.与 B.或 C.与非 D.异或
分析:
正溢:两个正数相加而绝对值超出允许的表示范围
负溢:两个负数相加绝对值超出允许的表示范围
例1:
8+7=15
0 1000
0 0111
———
0 1111(正确)
例2:
7+9=16
0 0111
0 1001
———
1 0000(正溢)
例3:
15+(-8)=7
0 1111
1 1000(-8的补码)
———
0 0111(正确)
例4:
(-8)+(-9)=-17
1 1000(-8的补码)
1 0111(-9的补码)
———
0 1111(负溢)
以上是对2个4位的带符号二进制数进行运算,运算结果仍然是1个4位带符号二进制数。
可以知道这个范围是-16~+15,上例中,例2和例4结果溢出。
令两个操作数的符号位分别为:Sa,Sb
结果的符号位为:SF
符号位直接参与运算,所产生的符号位进位为CF
讲符号位之后的A1和B1称为最高有效位,它产生的进位为C。
在例3中,C=1,但并没有溢出,进位不等于溢出,不能简单地单个进位信号去判断有无溢出。
给出一个判断溢出好用的方法:
单位号位的信息量只能表示两种可能:数为正或为负,如果产生溢出,就会使符号位的含义产生混乱。将符号位扩充为两位,信息量扩大,就能判别是否有溢出以及结果的正确符号。
同样以前面的几个算式为例:
例1':
8+7=15
00 1000
00 0111
———
00 1111(正确)
例2':
7+9=16
00 0111
00 1001
———
01 0000(正溢)
例3':
15+(-8)=7
00 1111
11 1000(-8的补码)
———
00 0111(正确)
例4':
(-8)+(-9)=-17
11 1000(-8的补码)
11 0111(-9的补码)
———
10 1111(负溢)
00——结果为正,无溢出
01——结果正溢
10——结果负溢
11——结果为负,无溢出
双符号位中,高位就是符号位的进位:CF,低位是结果位的符号位:SF
当CF与SF不同时,表示溢出,
相同时,表示操作正常。