文章目录
一、定点数运算
1.补码加减运算
原则上讲,对数值的加减运算可以用上述任何一种编码来实现,但是,用得最多、最普遍的是采用补码来实现加减法。
注意:符号位参加运算
(1)补码加法
补码加法: [X+Y]补=[X]补+[Y]补
例 3.1 若两个定点整数 63 和 35,利用补码加法求 63+35=?
解:根据题意,用 8 位二进制补码表示 63 和 35:
[63]补=0011 1111
[35]补=0010 0011
[63+35]补=0110 0010
例 3.2 若两个定点整数-63 和-35,利用补码加法求-63+(-35)=?
解:根据题意,用 8 位二进制补码表示-63 和-35:
[-63]补=1100 0001
[-35]补=1101 1101
则[-63+(-35)]补=1001 1110
(2)求补运算
注意:是在补码(移码)的基础上
求补运算≠补码,即求一个数的补码不等于对一个数求补。
求补法则:
①不管正负,对该数,所有位取反,然后+1,包括符号位。
②不管正负,对该数,从右往左,第一个1左边全部取反,包括符号位。
对一个正数求补即可得到该数的负数;若对该负数再求补又可得到原来的正数。也就是说[[X]补]求补=[-X]补;
[[-X]补]求补=[X]补。
PS:
[[X]移]求补=[-X]移;
[[-X]移]求补=[X]移。
[y]补 = 0010 0011
[-y]补 = [[y]补]求补 = 1101 1100 + 0000 0001 = 1101 1101
[x]补 = 1100 1000
[-x]补 = [[x]补]求补 = 0011 0111 + 0000 0001 = 0011 1000
注意:溢出,补码范围 − 2 n 到 2 n − 1 -2^n到2^n-1 −2n到2n−1。所以对1000(-8)求补得到1000,是个负数不是得到正数的补码,这是溢出。所以不能对最小负数的补码100…00求补。
小数则是:①包括符号位所有位取反,然后+ 2 − ( n − 1 ) 2^{-(n-1)} 2−(n−1)。②一样
(3)补码减法
补码减法:[X-Y]补=[X]补+[-Y]补 =[X]补+[[Y]补]求补
例 3.3 若两个定点整数 63 和 35,利用补码减法求 63-35=?
解:根据题意,用 8 位二进制补码表示 63 和 35:
[63]补=0011 1111
[35]补=0010 0011
[-35]补 =[[35]补]求补 =1101 1101
[63-35]补=[63]补+[-35]补 = 0011 1111 + 1101 1101 = 0001 1100。
(4)溢出
例 3.4 若两个定点整数 63 和 85,利用补码加法求 63+85=?
解:根据题意,若用 8 位二进制补码表示 63 和 85:
[63]补=00111111
[85]补=01010101
[63+35]补 = 00111111 +01010101 = 10010100
//两个正数相加为负,这显然是荒谬的。出现这种错误结果是由于在相加的过程中产生了溢出。
值得注意的是:只有当两个同符号的数相加(或者相减)时,运算结果才有可能溢出。而在异符号的数相加(或者相减)时,永远不会产生溢出。
(5)溢出VF的判定
1)双符号位(变形码)判决法【链接】
双符号位:
若运算结果两符号分别用 S2,S1 表示,则
判别溢出的逻辑表示式为: VF=s2⊕s1
例 3.7 设两正整数 X = +100 0001,Y = +100 0011,若用双符号位的 8 位补码表示,
则[X]补 = 00 100 0001,[Y]补 = 00 100 0011,求[X+Y]补。
解:计算[X]补+[Y]补 = 00 100 0001 + 00 100 0011 = 01 000 0100式中
VF=S2⊕S1=0⊕1 = 1,溢出发生
2)进位判决法
若Cn表示符号位的进位,Cn-1为最高数值位向最高位(符号位)的进位,则
判别溢出的逻辑表示式为:VF=Cn ⊕ Cn-1
在例 3.7 的运算过程中,Cn-1 为 1 而 Cn 为 0 ,故Cn-1⊕ Cn=1,表示运算结果有溢出
3)根据运算结果的符号位和进位标志判别
该方法适用于两同号数求和或异号数求差时判别溢出。SF 和 CF 分别是运算结果的符号标志和进位标志。
溢出的逻辑表达式为: VF=SF⊕CF
判别溢出时,一定要注意该判别方法的适用条件,否则,将会出错。
4)根据运算前后的符号位进行判别
若用 Xs、Ys、Zs 分别表示两个操作数及运算结果的符号位,溢出是否发生可根据运算前后的符号位进行判别
其逻辑表达式为: V F = X s ⋅ Y s ⋅ Z s ‾ + X s ‾ ⋅ Y s ‾ ⋅ Z s VF=Xs· Ys· \overline {Zs}+\overline {Xs}· \overline {Ys}· Zs VF=Xs⋅Ys⋅Zs+Xs⋅Ys⋅Zs
如例3.7中,VF=111+000=1,发生溢出。
2.移码加减运算
由于移码多用在浮点数中表示阶码,因此,在这里仅就定点整数移码的加减运算加以说明。
(1)移码的加减运算
①对两移码数求和/差时,首先对该两移码求和/差;
②然后,对结果进行修正——将结果的符号取反。这样,就可以得到正确的结果。
例 3.9 :用8位二进制移码表示十进制数的 57 和-35。并且求移码的和与差。
解:十进制数的 57 和-35 用移码表示如下:
[57]移 =1011 1001
[-35]移 =0101 1101
求两者之和:
①首先求[57]移 +[-35]移 =1011 1001+0101 1101=0001 0110;
②再将符号位取反,从而得到[57+(-35)]移 =1001 0110
求两者之差:
①首先求[57]移 -[-35]移 =[57]移 +[[-35]移 ]求补=10111001+10100011=01011100;
②再将符号位取反,从而得到[57-(-35)]移 =11011100。
(2)移码运算应注意的问题
①对移码运算的结果需要加以修正,修正量为 2^n ,即对结果的符号位取反后才是移码形式的正确结果。
②移码表示中,0 有唯一的编码为 1000…00。当出现 000…00 时(表示:-2^n),属于浮点数下溢,下溢按机器零处理。
二、纯小数乘法
0.总结
手工乘法、原码一位乘法:把符号位和数值位分开处理
补码一位乘法:符号位和数值位一起运算。就是原码一位乘法的基础上参与了符号位和修改了A0的计算方式。

1.原码一位乘法
(1)手工乘法
[
X
]
原
=
X
0
.
X
-
1
X
-
2
…
X
−
(
n
−
1
)
[X]原=X_0.X_{-1}X_{-2}…X_{-(n-1)}
[X]原=X0.X-1X-2…X−(n−1)
[
Y
]
原
=
Y
0
.
Y
-
1
Y
-
2
…
Y
−
(
n
−
1
)
[Y]原=Y_0.Y_{-1}Y_{-2}…Y_{-(n-1)}
[Y]原=Y0.Y-1Y-2…Y−(n−1)
其中 X0 、Y0 是它们的符号位。
同时,假定乘积为:
[
Z
]
原
=
Z
0
.
Z
-
1
Z
-
2
…
…
Z
-
(
2
n
−
1
)
[Z]原=Z_0 . Z_{-1}Z_{-2}……Z_{-(2n-1)}
[Z]原=Z0.Z-1Z-2……Z-(2n−1)
法则:
①乘积的符号位为被乘数的符号位与乘数的符号位相异或。
②乘积的数值位为被乘数的数值位与乘数的数值位之积。
这里的数值位被叫做绝对值,|X|=1101,|Y|=1011

PS:我们可以从上面观察到Z的尾数的数值位的位数为被乘数与乘数的尾数的位数之和。
手算过程中,要么是被乘数要么是0,同时下一级左移。我们一次即可把经过左移的四个被乘数加起来便可获得结果。
(2)原码一位乘法
原理:
原码一位乘法是模拟手算过程:右移既实现了乘数的每个位决定+X还是+0,又右移部分积实现了左移的被乘数相加的效果。
含义:
D表示部分积(每次相加的结果),A表示乘数,+X表示加被乘数。
(
X
×
Y
中
X
是
被
乘
数
,
Y
是
乘
数
X\times Y中X是被乘数,Y是乘数
X×Y中X是被乘数,Y是乘数)
结果为乘积的符号组合上最后一行的部分积和乘数。
法则:
- A0=0,+0
- A0=1,+X

2.补码一位乘法(布斯法)
| A 0 A_{0} A0 | A − 1 A_{-1} A−1 | A − 1 − A 0 A_{-1}-A_{0} A−1−A0 | 操作 |
|---|---|---|---|
| 0 | 0 | 0 | +0,右移一次 |
| 1 | 1 | 0 | +0,右移一次 |
| 1 | 0 | -1 | +[-X]补,右移一次 |
| 0 | 1 | 1 | +[X]补,右移一次 |
法则:
①乘数与被乘数均用补码表示,连同符号位一起参加运算。
②部分积做加法时使用双符号位。
)
三、纯小数除法
0.总结
手工除法、恢复余数法:把符号位和数值位分开处理
1.原码除法
(1)手工除法
)
(2)恢复余数法

精度够了就停止。

(3)加减交替法
加减交替法就是恢复余数法的化简:
恢复余数法:
假定第 i 次余数减除数(用 B 表示除数)得的余数为 R,当 R<0 时,应恢复余数,即 (R+B) 。然后左移一次,即 2(R+B)。接下来进行下一次(第 i+1 次)余数减除数,也就是 2(R+B)-B=2R+B。
加减交替法:
若第 i 次余数减除数的余数 R<0,这时不再加除数来恢复余数,而只是将其左移一次,变为 2R,到下次,即第 i+1 次运算时将其加除数,也就是 2R+B。

法则:
①若余数 R≥0, 则商上 1,左移一次,减除数;
②若余数 R<0, 则商上 0,左移一次,加除数。

四、浮点运算
1.浮点数加减法
X = M x ⋅ 2 E x , Y = M y ⋅ 2 E y X=M_x·2^{E_x}, Y=M_y·2^{E_y} X=Mx⋅2Ex,Y=My⋅2Ey
实现 X±Y 运算的法则即过程如下四步:
- 先用规格化浮点数表示出来:https://blog.youkuaiyun.com/sandalphon4869/article/details/89395749#1_468
- 对阶
- 尾数进行加减
- 规格化
- 舍入
(1)对阶
如:
1
×
1
0
2
+
1
×
1
0
1
=
1
×
1
0
2
+
0.1
×
1
0
2
=
1.1
×
1
0
2
1\times10^2+1\times 10^1=1\times 10^2+0.1\times 10^2=1.1\times 10^2
1×102+1×101=1×102+0.1×102=1.1×102
在相同指数下,我们才能进行加减,也就是对阶。
对阶的原则是小阶对大阶,也就是将小阶码变成大阶码,让两阶码相等。将尾数右移(除,数缩小),为了平衡,阶码就得增大。
判断谁是小阶码:
[
△
E
]
补
=
[
E
X
]
补
−
[
E
Y
]
补
[△E]补=[E_X]补 -[E_Y]补
[△E]补=[EX]补−[EY]补
- [ △ E ] 补 表 示 负 数 , 则 [ E X ] 补 是 小 阶 码 [△E]补表示负数,则[E_X]补是小阶码 [△E]补表示负数,则[EX]补是小阶码
- [ △ E ] 补 表 示 正 数 , 则 [ E Y ] 补 是 小 阶 码 [△E]补表示正数,则[E_Y]补是小阶码 [△E]补表示正数,则[EY]补是小阶码
左移时:末位补0
右移时:高位正数补0,负数补1(保持符号位不变)
PS:这里的左移右移不是左规右规,不需要转化为特殊的形式,左规右规是左移右移成为特殊的形式。
(2)尾数进行加减
都用加法:在做减法时,只要先将减数求补,然后与被减数相加即可。
使用双符号位的形式:在同数相加时,单符号位会出现正负不一致的结果。
(3)规格化
意义:
在进行尾数加减运算后,其结果有可能是一个非规格化数,则需要将其规格化。
规格化的结果用单符号位表示:
-
① 左规
(左移时小数点前只保留一位符号位,那一位直接舍弃,左移成为1.0XX…X或,0.1XX…X的规格化的浮点数)
左移1次使阶码减 1。 -
② 右规
(右移一次刚好是1.0XX…X或,0.1XX…X,成为了规格化的浮点数)
右移一次使阶码加 1。
规格化的结果用双符号位表示:
按照单符号位表示的结果扩展为双符号位即可。
浮点数的溢出与否是由阶码决定的:
- 左移1次使阶码减 1,若阶码(包括 1 位符号位)用 n位补码整数表示,它能表示的最小阶码为 − 2 n − 1 -2^{n-1} −2n−1。如果左规使阶码小于 − 2 n − 1 -2^{n-1} −2n−1,则发生下溢出。 发生下溢出时可认为结果为 0。
- 右移一次使阶码加 1,有可能使阶码超出所能表示的最大范围,为 2 n − 1 − 1 2^{n-1}-1 2n−1−1。如果出现这种情况,结果将无法表示,这就是上溢出。一旦发生上溢出,可认为结果为∞。
顺序:
在浮点数加减运算时,右规最多 1 次。所以,先看看能不能右规,不能右规就左规。
(4)舍入
在对阶及规格化时,右规才出现舍入的问题:右移将丢掉尾数的最低位。
- ① 截(尾)断法
此法最简单,就是将需丢弃的尾数低位丢弃。 - ② 末位恒置 1 法
无论尾数右移丢弃的是 0 还是 1,此法将保证要保留的尾数的最低位永远为 1。 - ③ 0 舍 1 入法
当尾数右移丢弃的是 0 时,要保留的最末位不变;
当尾数右移丢弃的是 1 时,要保留的最末位加 1。
这种方法误差较小。但当遇到 01.111…11 这种需在规的尾数时,采用此法会再次使尾数溢出。遇到这种情况可采用截尾法
(5)例题
例 3.18: 两 浮 点 数 为 : X = 0.110101 × 2 − 010 , Y = − 0.101010 × 2 − 001 两浮点数为:X=0.1101 01×2^{-010},Y=-0.1010 10×2^{-001} 两浮点数为:X=0.110101×2−010,Y=−0.101010×2−001。求两数之和及差。
解:设两浮点数阶码为 4 位,用补码表示。尾数用 8 位,均用双符号位补码表示。
则两数可表示为:
[
X
]
浮
=
1110
00.110101
,
[
Y
]
浮
=
1111
11.010110
[X]浮=1110 \quad 00.1101 01,[Y]浮=1111 \quad 11.0101 10
[X]浮=111000.110101,[Y]浮=111111.010110
-
①对阶
求阶差:[△E]补=[EX]补 -[EY]补 ﹦[EX]补 +[[EY]补]求补 = 1110+0001﹦1111。1111表示负数,所以 X 的阶码比 Y的阶码小。
因此,X 尾数右移一次,使两者阶码相同。这时的 X 为: [ X ] 浮 = 1111 00.011011 [X]浮=1111\quad 00.011011 [X]浮=111100.011011,采用的是 0 舍 1 入法。 -
②尾数进行加减
[ [ M y ] 补 ] 求 补 = 00.101001 + 1 = 00.101010 [[M_y]补]求补=00.101001+1=00.101010 [[My]补]求补=00.101001+1=00.101010.
尾数求和: 00.011011 + 11.010110 = 11.110001 00.011011 + 11.010110 = 11.110001 00.011011+11.010110=11.110001
尾数求差: 00.011011 + 00.101010 = 01.000101 00.011011 + 00.101010 = 01.000101 00.011011+00.101010=01.000101 -
③规格化
相加的结果为一非规格化尾数。右规一次不能满足,那么只能左规。尾数左移 2位,变11.000100。同时,阶码减 2,则阶码变为 1101。
两数相加结果为: [ X + Y ] 浮 = 1101 11.000100 [X+Y]浮=1101\quad 11.000100 [X+Y]浮=110111.000100。
相减的结果看到尾数也不是规格化数。右规满足,将尾数右移一次,采用的是 0舍1入法,变为 00.100011。同时,阶码需加 1,则阶码为 0000。
两数相减结果为: [ X − Y ] 浮 = 0000 00.100011 [X-Y]浮=0000\quad 00.100011 [X−Y]浮=000000.100011。
例:某规格化浮点数字长11位,阶码4位(含1位符号),用移码表示;尾数7位(含1位符号),补码表示。 x = 2 − 110 × ( − 0.101100 ) , y = 2 − 101 × ( + 0.101100 ) 。 求 和 差 x=2^{-110}\times (-0.101100),y=2^{-101}\times (+0.101100)。求和差 x=2−110×(−0.101100),y=2−101×(+0.101100)。求和差
解:
对阶后的X为:
[
X
]
浮
=
0011
1.101010
[X]浮=0011\quad 1.101010
[X]浮=00111.101010,Y为:
[
Y
]
浮
=
0011
0.101100
[Y]浮=0011\quad 0.101100
[Y]浮=00110.101100。
(若采用单符号位:尾数求和为0.010110,尾数求差为0.111110,负数-正数=正数,错误了。)
尾数求和:
11.101010
+
00.101100
=
00.010110
11.101010 + 00.101100 = 00.010110
11.101010+00.101100=00.010110
尾数求差:
11.101010
+
11.010100
=
10.111110
11.101010 + 11.010100 = 10.111110
11.101010+11.010100=10.111110
规格化为:
[
X
+
Y
]
浮
=
0010
0.101100
[X+Y]浮=0010\quad 0.101100
[X+Y]浮=00100.101100(尾数左移1位,阶码减1)
[
X
−
Y
]
浮
=
0100
1.011111
[X-Y]浮=0100\quad 1.011111
[X−Y]浮=01001.011111(尾数右移1位,阶码加1)
2.浮点数乘法
设两个浮点数:
X
=
M
x
⋅
2
E
x
,
Y
=
M
y
⋅
2
E
y
X=M_x·2^{Ex},Y=M_y·2^{Ey}
X=Mx⋅2Ex,Y=My⋅2Ey.
该两浮点数相乘为:
Z
=
(
M
x
⋅
M
y
)
2
E
x
+
E
y
Z=(M_x·M_y)2^{Ex+ Ey}
Z=(Mx⋅My)2Ex+Ey。
两浮点数相乘之积的阶码为两乘数阶码之和,乘积的尾数为两乘数尾数之积。
步骤
①参加乘法运算的两浮点数一定是规格化数,且不为 0。只要有一个乘数为 0,则乘积必为 0。
②求两乘数阶码之和,即 Ez=Ex+Ey。
并判断积的阶码是否溢出:
- 当积的阶码大于所定义浮点数最大阶码,即 Ez>Emax 时,上溢出。一旦发生上溢出,则乘积将无法表示;
- 若积的阶码小于所定义浮点数最小阶码,即 Ez<-Emax 时,则下溢出。发生下溢出时,乘积可用 0 表示。当发生溢出时,尤其是上溢,应重新定义浮点数或对两乘数作出限制。
③两乘数的尾数相乘。
④规格化乘积的尾数。
PS:两规格化浮点数相乘,左规和右规都最多一次。
尾数的最小正值为:+1/2 ,尾数的最大正值为:
+
(
1
-
2
−
n
)
+(1-2^{-n})
+(1-2−n) 。
尾数的最小负值为:-1 ,尾数的最大负值为:
−
(
1
/
2
+
2
−
n
)
-(1/2+2^{-n})
−(1/2+2−n) 。
见:https://blog.youkuaiyun.com/sandalphon4869/article/details/89395749#2_470
所以两数之积的最小绝对值为1/4(
1
/
2
×
1
/
2
1/2\times 1/2
1/2×1/2),如果左规,最多一次。
两数之积的最大绝对值为1(
(
−
1
)
×
(
−
1
)
(-1)\times (-1)
(−1)×(−1)),如果右规,最多一次。
3.浮点数除法
设两个浮点数:
X
=
M
x
⋅
2
E
x
,
Y
=
M
y
⋅
2
E
y
X=M_x·2^{Ex},Y=M_y·2^{Ey}
X=Mx⋅2Ex,Y=My⋅2Ey.
该两浮点数相乘为:
Z
=
(
M
x
÷
M
y
)
2
E
x
−
E
y
Z=(M_x\div M_y)2^{Ex - Ey}
Z=(Mx÷My)2Ex−Ey。
两浮点数相乘之积的阶码为两乘数阶码之差,乘积的尾数为两乘数尾数之商。
步骤
①参加乘法运算的两浮点数一定是规格化数,且不为 0。只要有一个乘数为 0,则乘积必为 0。
②求两乘数阶码之差,即 Ez=Ex-Ey。
并判断积的阶码是否溢出:
- 当商的阶码大于所定义浮点数最大阶码,即 Ez>Emax 时,上溢出。一旦发生上溢出,则商将无法表示;
- 若商的阶码小于所定义浮点数最小阶码,即 Ez<-Emax 时,则下溢出。发生下溢出时,商可用 0 表示。当发生溢出时,尤其是上溢,应重新定义浮点数或对被除数除数作出限制。
③两乘数的尾数相乘。
④规格化乘积的尾数。
本文详细介绍了定点数和浮点数的运算方法。定点数运算包括补码和移码的加减运算,以及溢出判定;纯小数运算涉及乘法和除法的原码、补码算法。浮点数运算涵盖加减法的对阶、尾数加减、规格化和舍入,以及乘除法的阶码和尾数运算及溢出判断。
2312

被折叠的 条评论
为什么被折叠?



