定点数运算及溢出检测
[ x ] 补 + [ y ] 补 = [ x + y ] 补 ( m o d M ) [ x ] 补 − [ y ] 补 = [ x − y ] 补 = [ x ] 补 + [ − y ] 补 ( m o d M ) [x]_补+[y]_补 = [x+y]_补 \ \ \ \ (mod M)\\ [x]_补-[y]_补 = [x-y]_补 =[x]_补+[-y]_补 \ \ (mod M) [x]补+[y]补=[x+y]补 (modM)[x]补−[y]补=[x−y]补=[x]补+[−y]补 (modM)
取反技巧:
通过右向左扫描 [ Y ] 补 [Y]_补 [Y]补,在遇到数字1及之前,直接输出遇到的数字,遇到1之后,取反输出,即可得到 [ − Y ] 补 [-Y]_补 [−Y]补,反之亦然!
溢出:运算结果超出了某种数据类型的表示范围。
溢出的检测方法
(1) 对操作数和运算结果的符号位进行检测
当结果的符号位与操作数的符号不相同时就表明发生了溢出
(设 X 0 X_0 X0 , Y 0 Y_0 Y0 为参加运算数的符号位, S 0 S_0 S0 为结果的符号位)
V = X 0 Y 0 S 0 ‾ + X 0 Y 0 ‾ S 0 V=X_0Y_0\overline {S_0}+\overline{X_0Y_0}S_0 V=X0Y0S0+X0Y0S0
当V=1时,运算结果溢出
(2)对最高数据位进位和符号进位进行检测
设运算时最高数据位产生的进位为 C 1 C_1 C1,符号位产生的进位为 C 0 C_0 C0,
溢出检测电路为: V = C 0 ⊕ C 1 V= C_0 ⊕ C_1 V=C0⊕C1
(3)用变型补码
[ X ] 补 = X f 1 X f 2 . X 1 X 2 X 3 … X n m o d 2 n + 2 [X]_补 = X_{f1}X_{f2}. X_1X_2X_3…X_n \ \ mod 2^{n+2} [X]补=Xf1Xf2.X1X2X3…Xn mod2n+2
溢出的判断:
V = X f 1 ⊕ X f 2 V=X_{f1}⊕X_{f2} V=Xf1⊕Xf2