定点数运算及溢出检测
1.定点数加法运算
[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
2.定点数减法运算
[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
3.溢出的概念及判断方法
1)溢出的概念
运算结果超出了某种数据类型的表示范围。
例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 两个负数之和为正数
2)溢出的检测方法
溢出只可能发生在同符号数相加时,包括[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;}
注:体会软/硬件功能的等效差异性!体会软/硬件协同系统观!
4.无符号数运算的溢出判断
无符号数加法的溢出可用ALU的进位表示
无符号数减法的溢出也可用带加/减功能的ALU的进位取反后表示