[X]补 + [Y]补 = [X + Y]补 mod 2n+1
算法理解
例 1 已知X = +10010, Y = -10101 ,求X + Y
解: [X]补=010010 ,[Y]补=101011
[X+Y]补=010010+101011
=111101
所以:X+Y= -00011
[X-Y]补=[X]补-[Y]补=[X]补+[-Y]补
算法理解
例2 已知[Y]补=10011 ,求[-Y]补
解: [Y]补 =10010
∵ \because ∵ Y=-1101 -Y=1101
∴ \therefore ∴ [-Y]补=01101
对比 [Y]补 =10011
可知:通过又向左扫描[Y]补,在遇到数字1及之前,直接输出遇到的数字,遇到1之后,取反输出,即可得到[-Y]补,反之亦然!
例3 已知 X= +10101,Y= +10010,求X-Y
解: [X]补=010101,[Y]补=010010,[-Y]补=101110
[X-Y]补= [X]补+[-Y]补= 010101+101110
=l 000011
∴ \therefore ∴ X-Y= +00011
运算结果超出了某种数据类型的表示范围。
例4 已知 X= +10010,Y= +10101,求X+Y
解: [X]补=010010 [Y]补=010101
[X+Y]补= [X]补+[Y]补= 010010+010101
=100111
∴ \therefore ∴ X+Y= -11001
两个正数之和为负数!
例5 已知X= -10010,Y= -10101,求X+Y
解: [ X ] 补 = 101110 [ Y ] 补 = 101011   [ X + Y ] 补 = [ X ] 补 + [ Y ] 补 = 101110 + 101011 = 1 010001 ∴ X + Y = + 010001 两 个 负 数 之 和 为 正 数 [X]_补=101110\quad[Y]_补=101011\newline\qquad\quad\ \ \,[X+Y]_补=[X]_补+[Y]_补=101110+101011\newline\qquad\qquad\qquad\qquad\ ={\color{red}{1}}\ 010001\newline\ \newline\qquad\quad\ \therefore\ X+Y=\ +010001\newline\ \newline\qquad\quad\ {\color{red}{两个负数之和为正数}} [X]补=101110[Y]补=101011 [X+Y]补=[X]补+[Y]补=101110+101011 =1 010001 ∴ X+Y= +010001 两个负数之和为正数
溢出只可能发生在同符号数相加时,包括[X]补与[Y]补;[X]补与
[-Y]补同号;
当结果的符号位与操作数的符号不相同时就表明发生了溢出(设X0,Y0为参加运算数的符号位,S0为结果的符号位)
V = X 0 Y 0 S ‾ + X 0 ‾ Y 0 ‾ S V=X_0\ Y_0\ \overline{S}+\overline{X_0}\ \overline{Y_0}\ S V=X0 Y0 S+X0 Y0 S
当 V=1 时,运算结果溢出,根据该逻辑表达式,容易画出相应电路。
设运算时最高数据位产生的进位为C0,
溢出检测电路为: V = C 0 ⨁ C 1 V=C_0\ {\bigoplus}\ C_1 V=C0 ⨁ C1
0. X 1 + 0. Y 1 0.X_1 + 0.Y_1 0.X1+0.Y1: 此时 C0=0,若C1=1则改变了结果符号位,发生了溢出。
1. X 1 + 1. Y 1 1.X_1+1.Y_1 1.X1+1.Y1:此时 C0=1,若C1=0则改变了结果符号位,发生溢出。
[ 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\qquad mod\quad 2^{n+2} [X]补=Xf1Xf2X1X2X3...Xnmod2n+2
溢出的判断: V = X f 1 ⨁ X f 2 V=X_{f1}\ {\bigoplus}\ X_{f2} V=Xf1 ⨁ Xf2
例6 已 知 X = 10010 , Y = − 10101 , 求 X + Y 解 : [ X ] 补 = 1101110 [ Y ] 补 = 1101011 [ X + Y ] 补 = [ X ] 补 + [ Y ] 补 = 1101110 + 1101011 = 1 10 1001 V = 1 ⨁ 0 = 1 故 发 生 溢 出 ! 已知X=\ 10010,\quad Y=\ -10101,\quad 求X+Y\newline 解:[X]_补=1101110\quad[Y]_补=1101011\newline\ [X+Y]_补=[X]_补+[Y]_补=1101110+1101011\newline ={\color{blue}{1}}\ {\color{red}{10}}\ 1001\newline\ \newline\ V=1\ {\bigoplus}\ 0=1\ 故发生溢出! 已知X= 10010,Y= −10101,求X+Y解:[X]补=1101110[Y]补=1101011 [X+Y]补=[X]补+[Y]补=1101110+1101011=1 10 1001 V=1 ⨁ 0=1 故发生溢出!
上述三种方法可基于逻辑表达式画出相应电路,在后面的运算部分,还将具体讲解。
int tadd_ok(int x,int y){
int sum = x + y;
int net_over = x < 0 && sum >=0;
int pos_over = x > 0 && sum <0;
return !neg_over && pos_over;}
注:体会软/硬件功能的等效差异性!体会软/硬件协同系统观!
无符号数加法的溢出可用ALU的进位表示
无符号数减法的溢出也可用带加/减功能的ALU的进位取反后表示
参考文献:https://www.icourse163.org/course/HUST-1003159001侵权删