计组(三)运算方法与运算

本文详细介绍了定点数和浮点数的运算方法。定点数运算包括补码和移码的加减运算,以及溢出判定;纯小数运算涉及乘法和除法的原码、补码算法。浮点数运算涵盖加减法的对阶、尾数加减、规格化和舍入,以及乘除法的阶码和尾数运算及溢出判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、定点数运算

1.补码加减运算

原则上讲,对数值的加减运算可以用上述任何一种编码来实现,但是,用得最多、最普遍的是采用补码来实现加减法。

注意:符号位参加运算

(1)补码加法

补码加法: [X+Y]补=[X]补+[Y]补

3.1 若两个定点整数 6335,利用补码加法求 6335=?
解:根据题意,用 8 位二进制补码表示 6335: 
[63]补=0011 111135]补=0010 00116335]补=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 2n2n1。所以对1000(-8)求补得到1000,是个负数不是得到正数的补码,这是溢出。所以不能对最小负数的补码100…00求补。

小数则是:①包括符号位所有位取反,然后+ 2 − ( n − 1 ) 2^{-(n-1)} 2(n1)。②一样

(3)补码减法

补码减法:[X-Y]补=[X]补+[-Y]补 =[X]补+[[Y]补]求补

3.3 若两个定点整数 6335,利用补码减法求 6335=?
解:根据题意,用 8 位二进制补码表示 6335:
 [63]补=0011 111135]补=0010 0011
 [-35]补 =[[35]补]求补 =1101 11016335]补=[63]补+[-35]补 = 0011 1111 + 1101 1101 = 0001 1100

(4)溢出

3.4 若两个定点整数 6385,利用补码加法求 6385=?
解:根据题意,若用 8 位二进制补码表示 6385: 
[63]补=0011111185]补=010101016335]补 = 0011111101010101 = 10010100
//两个正数相加为负,这显然是荒谬的。出现这种错误结果是由于在相加的过程中产生了溢出。
8位二进制补码来表示带符号的整数,数值范围是-128 ~ +127
上溢出:超出+127
下溢出:超出-128

值得注意的是:只有当两个同符号的数相加(或者相减)时,运算结果才有可能溢出。而在异符号的数相加(或者相减)时,永远不会产生溢出。

(5)溢出VF的判定

VF
0:无溢出
1:溢出发生
1)双符号位(变形码)判决法【链接】

双符号位:

若运算结果两符号分别用 S2,S1 表示,则

判别溢出的逻辑表示式为: VF=s2⊕s1

VF=S2⊕S1
=0:双符号位11或00,一致无溢出
=1:双符号位01,不一致,溢出发生
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=01 = 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 VFXsYsZsXsYsZs

如例3.7中,VF=111+000=1,发生溢出。

2.移码加减运算

由于移码多用在浮点数中表示阶码,因此,在这里仅就定点整数移码的加减运算加以说明。

(1)移码的加减运算

①对两移码数求和/差时,首先对该两移码求和/差;

②然后,对结果进行修正——将结果的符号取反。这样,就可以得到正确的结果。

3.9 :8位二进制移码表示十进制数的 57 和-35。并且求移码的和与差。

解:十进制数的 57 和-35 用移码表示如下:
 [57]移  =1011 1001-35]移 =0101 1101
求两者之和:
①首先求[57]移 +[-35]移 =1011 10010101 11010001 0110;
②再将符号位取反,从而得到[57+(-35)]移 =1001 0110
求两者之差:
①首先求[57]移 -[-35]移 =[57]移 +[[-35]移 ]求补=101110011010001101011100;
②再将符号位取反,从而得到[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.X1X2X(n1)
[ Y ] 原 = Y 0 . Y - 1 Y - 2 … Y − ( n − 1 ) [Y]原=Y_0.Y_{-1}Y_{-2}…Y_{-(n-1)} [Y]Y0.Y1Y2Y(n1)
其中 X0 、Y0 是它们的符号位。
同时,假定乘积为: [ Z ] 原 = Z 0 . Z - 1 Z - 2 … … Z - ( 2 n − 1 ) [Z]原=Z_0 . Z_{-1}Z_{-2}……Z_{-(2n-1)} ZZ0.Z1Z2Z2n1

法则:
①乘积的符号位为被乘数的符号位与乘数的符号位相异或。
②乘积的数值位为被乘数的数值位与乘数的数值位之积。

这里的数值位被叫做绝对值,|X|=1101,|Y|=1011
在这里插入图片描述
PS:我们可以从上面观察到Z的尾数的数值位的位数为被乘数与乘数的尾数的位数之和。
手算过程中,要么是被乘数要么是0,同时下一级左移。我们一次即可把经过左移的四个被乘数加起来便可获得结果。

(2)原码一位乘法

原理:
原码一位乘法是模拟手算过程:右移既实现了乘数的每个位决定+X还是+0,又右移部分积实现了左移的被乘数相加的效果。

含义:
D表示部分积(每次相加的结果),A表示乘数,+X表示加被乘数。
X × Y 中 X 是 被 乘 数 , Y 是 乘 数 X\times Y中X是被乘数,Y是乘数 X×YXY
结果为乘积的符号组合上最后一行的部分积和乘数。

法则:

  • A0=0,+0
  • A0=1,+X
    在这里插入图片描述

2.补码一位乘法(布斯法)

A 0 A_{0} A0 A − 1 A_{-1} A1 A − 1 − A 0 A_{-1}-A_{0} A1A0操作
000+0,右移一次
110+0,右移一次
10-1+[-X]补,右移一次
011+[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=Mx2ExY=My2Ey

实现 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} 2n1。如果左规使阶码小于 − 2 n − 1 -2^{n-1} 2n1,则发生下溢出。 发生下溢出时可认为结果为 0。
  • 右移一次使阶码加 1,有可能使阶码超出所能表示的最大范围,为 2 n − 1 − 1 2^{n-1}-1 2n11。如果出现这种情况,结果将无法表示,这就是上溢出。一旦发生上溢出,可认为结果为∞。

顺序:

在浮点数加减运算时,右规最多 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×2010Y=0.101010×2001。求两数之和及差。

解:设两浮点数阶码为 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 [XY]=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=2110×(0.101100)y=2101×(+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 [XY]=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=Mx2ExY=My2Ey.
该两浮点数相乘为: Z = ( M x ⋅ M y ) 2 E x + E y Z=(M_x·M_y)2^{Ex+ Ey} Z=MxMy2Ex+Ey
两浮点数相乘之积的阶码为两乘数阶码之和,乘积的尾数为两乘数尾数之积

步骤

参加乘法运算的两浮点数一定是规格化数,且不为 0。只要有一个乘数为 0,则乘积必为 0。
②求两乘数阶码之和,即 Ez=Ex+Ey。

并判断积的阶码是否溢出:

  • 当积的阶码大于所定义浮点数最大阶码,即 Ez>Emax 时,上溢出。一旦发生上溢出,则乘积将无法表示;
  • 若积的阶码小于所定义浮点数最小阶码,即 Ez<-Emax 时,则下溢出。发生下溢出时,乘积可用 0 表示。当发生溢出时,尤其是上溢,应重新定义浮点数或对两乘数作出限制。

③两乘数的尾数相乘。
④规格化乘积的尾数。

PS:两规格化浮点数相乘,左规和右规都最多一次。
尾数的最小正值为:+1/2 ,尾数的最大正值为: + ( 1 - 2 − n ) +(1-2^{-n}) (12n)
尾数的最小负值为:-1 ,尾数的最大负值为: − ( 1 / 2 + 2 − n ) -(1/2+2^{-n}) (1/2+2n)
见: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=Mx2ExY=My2Ey.
该两浮点数相乘为: Z = ( M x ÷ M y ) 2 E x − E y Z=(M_x\div M_y)2^{Ex - Ey} Z=Mx÷My2ExEy
两浮点数相乘之积的阶码为两乘数阶码之差,乘积的尾数为两乘数尾数之商

步骤

①参加乘法运算的两浮点数一定是规格化数,且不为 0。只要有一个乘数为 0,则乘积必为 0。
②求两乘数阶码之差,即 Ez=Ex-Ey。

并判断积的阶码是否溢出:

  • 当商的阶码大于所定义浮点数最大阶码,即 Ez>Emax 时,上溢出。一旦发生上溢出,则商将无法表示;
  • 若商的阶码小于所定义浮点数最小阶码,即 Ez<-Emax 时,则下溢出。发生下溢出时,商可用 0 表示。当发生溢出时,尤其是上溢,应重新定义浮点数或对被除数除数作出限制。

③两乘数的尾数相乘。
④规格化乘积的尾数。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值