0 0|0 1□

第 3 版 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照

### 0 0|0 1□
00|011
2R?(R和Q同时左移,空出一位商)
R?=2R?-Y
R?>0,则Q?=1
01010
+10011
11101
+01101
01010
0011□
00110
00110
2R?(R和Q同时左移,空出一位商)
R?=2R?-Y
R?<0,则Q?=0
恢复余数:R?=R?+Y
得R?
10100
+10011
00111
0110□
|01101
2R?(R和Q同时左移,空出一位商)
R?=2R?-Y
Rs>0,则Qo=l


<!-- page: 90 -->

运算方法和运算部件
商的最高位为0,说明没有溢出,商的数值部分为1101。所以,[x/y]=1.1101(最高位
为符号位),余数为0.0111×2-'。
2.不恢复余数除法
在恢复余数除法运算中,当中间余数与除数相减结果为负时,要多做一次+Y操作,因
而降低了算法执行速度,又使控制线路变得复杂。在计算机中很少采用恢复余数除法,而普
遍采用不恢复余数除法。其实现原理如下。
在恢复余数除法中,第i次余数为R,=2R,-?-Y。根据下次中间余数的计算方法,有
以下两种不同情况:
(1)若R,≥0,则上商1,不需恢复余数,直接左移一位后试商,得下次余数R,,即
R+=2R,-Y;
(2)若R,<0,则上商0,且需恢复余数后左移一位再试商,得下次余数R,即R,+=
2(R,+Y)-Y=2R,+Y。
当第i次中间余数为负时,可以跳过恢复余数这一步,直接求第i+1次中间余数。这
种算法称为不恢复余数法。从上述推导可以发现,不恢复余数法的算法要点就是6个字:
“正、1、减,负、0、加”。其含义就是:若中间余数为正数,则上商为1,下次做减法;若中间余
数为负数,则上商为0,下次做加法。这样运算中每次循环内的步骤都是规整的,差别仅在
做加法还是减法,所以,这种方法也称为“加减交替法”。采用这种方法有一点要注意,即如
果在最后一步上商为0,则必须恢复余数,把试商时减掉的除数加回去。
例3.5 已知[x]w=0.1011,[y]*=1.1101,用不恢复余数法计算[x/y]。
解:分符号位和数值位两部分进行。
商的符号位:0+1=1。
商的数值位采用不恢复余数法。减法操作用补码加法实现,是否够减通过中间余数的
符号来判断,所以中间余数要加一位符号位。先计算出X=[lx|]=0.1011,Y=[ly|]#=
0.1101,-Y=[-|y|]*=1.0011。
运算过程如下:
余数寄存器 R
余数/商寄存器 Q
说明
01011
0000□
开始R?=X
+10011
R?=X-Y
1.1110
00000
R?<0,则Q?=0,没有溢出
11100
0000□
2R?(R和Q同时左移,空出一位商)
+01101
R?=2R?+Y
01001
00001
R?>0,则Q?=1
10010
00010
2R?(R和Q同时左移,空出一位商)
+10011
R?=2R?-Y
00101
### 0 0|011
R?>0.则Q?=1
01010
0|0110
2R?(R和Q同时左移,空出一位商)
R?=2R?-Y
+10011
11101
0|0110
R?<0,则Q?=0
11010
01100
2R?(R和Q同时左移,空出一位商)
+01101
R?=2R?+Y
00111
01101
Rs>0,则Q?=1
第3章
73


<!-- page: 91 -->

计算机组成与系统结构(第3版)
74
商的最高位为0,说明没有溢出,商的数值部分为1101。所以,[x/y]w=1.1101(最高位为
符号位),余数为0.0111×2-*。
从上述几个除法例子以及有关恢复余数法和不恢复余数法的算法流程可以看出,要得
到n位无符号数的商,需要循环n+1次,其中第一次得到的不是真正的商,而是用来判断
溢出的。为了节省运算时间,第一次可以不试商而直接左移,这样只要n次循环。因为对
于两个n位定点整数除法来说,其商一定不会超过n位,所以不会发生溢出,因而n位定点
整数除法第一次无须试商来判断溢出。
3.3.7补码除法运算
补码作为带符号整数的表示形式,需要计算机能实现定点补码整数的除法运算。与补
码加减运算、补码乘法运算一样,补码除法也可以将符号位和数值位合在一起进行运算,而
且商符直接在除法运算中产生。对于两个n位补码除法,被除数需要进行符号扩展。若被
除数为2n位,除数为n位,则被除数无须扩展。
同样,首先要对被除数和除数的取值、大小等进行相应的判断,以确定除数是否为0,商
是否为0、是否溢出等。
因为补码除法中被除数、中间余数和除数都是有符号的,所以,不像无符号除法和原码
除法那样可以直接用做减法来判断是否够减,而应该根据被除数(中间余数)与除数之间符
号的异同或差值的正负来确定下次做减法还是加法,再根据加或减运算的结果来判断是否
够减。表 3.2 给出了判断是否够减的规则。
表 3.2 补码除法根据符号判断是否够减的规则
中间余数 R
除数Y
新中间余数:R-Y
新中间余数:R+Y
0
1
0
1
0
0
够减
不够减
0
1
够减
不够减
1
0
不够减
够减
1
1
不够减
够减
从表3.2可看出,当被除数(中间余数)与除数同号时做减法;异号时,做加法。若加减
运算后得到的新余数与原余数符号一致(余数符号未变)则够减;否则不够减。
根据是否立即恢复余数,补码除法也分为恢复余数法和不恢复余数法两种。
1.补码恢复余数除法
根据补码除法判断是否够减的判断规则,可以得到如下补码恢复余数除法的算法要点。
(1)操作数的预置。除数装入除数寄存器Y,被除数符号扩展后装入余数寄存器R和
余数/商寄存器Q。
(2)R和Q同步串行左移一位。
(3)若R与Y同号,则做减法,即R=R-Y;否则,做加法,即R=R+Y,并按以下规则
确定第i次循环得到的商Q-
①若R和Q中的余数=0或R操作前后符号未变,则表示够减,Qa-,置1,转第(4)步。


<!-- page: 92 -->

运算方法和运算部件
②若R操作前后符号已变,表示不够减,则Q-置0,恢复R值后转第(4)步。
(4)重复第(2)和第(3)步,直到取得n位商为止。
(5)若被除数与除数同号,则Q中是真正的商;否则,将Q中的数值求补后作为商。
(6)余数在R中。
从上述算法要点可以看出,在进行置商时,采用了“够减则上商为1,不够减则上商为0”
的上商方式,因此,若商为负值,则需要通过“各位取反,末位加1”来得到真正的商。
例3.6 用4位补码恢复余数法计算一7/3的值。
解:一7的8位补码表示为X=[x]#=11111001,3的4位补码表示为Y=[y]=
0011,-Y=[-y]n=1101。
余数寄存器R⋯余数/商寄存器Q
说 明
1111
1001
开始 R?=X
1111
001[□
2R?(R和Q同时左移,空出一位商)
+0011
R与Y异号,加
0010
001[□
R符号已变
恢复(减)
+1101
1111
0010
Q?置0,得R?
1110
### 0 10□
2R?(R和Q同时左移,空出一位商)
R与Y异号,加
+0.01
0001
R符号已变
010□
恢复(减)
+110
1110
0100
Q?置0,得R?
100□
2R?(R和Q同时左移,空出一位商)
1100
+0011
R与Y异号,加
1111
1001
R符号未变,Q?置1.得R?
1111
0010
2R?(R和Q同时左移,空出一位商)
+0011
R与Y异号,加
0010
0010
R符号已变
+1101
恢复(减)
0010
Q?置0,得R?
1111
因为被除数与除数异号,故商取补为1110,余数为1111,即-7/3=-2,余数为-1。
2.补码不恢复余数除法
根据补码除法判断是否够减的判断规则,可以得到如下补码不恢复余数除法的算法
要点。
(1)操作数的预置。除数装入除数寄存器Y,被除数符号扩展后装入余数寄存器R和
余数/商寄存器Q。
(2)根据以下规则求第一位商Q。。若X与Y同号,则做减法,即R?=X-Y;否则,做
加法,即R?=X+Y,并按以下规则确定商值Q。
①若新的中间余数R,与Y同号,则Q,置1,转第(3)步。
② 若新的中间余数 R;与Y异号,则Q。置0,转第(3)步。
Q,用来判断是否溢出,而不是真正的商。以下情况下会发生溢出:X与Y同号且上商
Q?=1,或者,X与Y异号且上商Q.=0。
(3)对于i=1到n,按以下规则求出相应商。
①若R,与Y同号,则Qa,置1,R,=2R,-Y,i=i+1。
第3章
75


<!-- page: 93 -->

计算机组成与系统结构(第3版)
76
②若R,与Y异号,则Q-,置0,R=2R,+Y,i=i+1。
(4)商的修正。最后一次 Q寄存器左移一位,将最高位Q。移出,并在最低位置上商
Q?。若被除数与除数同号,则Q中就是真正的商;否则,将Q中的商的末位加1。
(5)余数的修正。若余数符号同被除数符号,则不需修正,余数在R中;否则,按下列规
则进行修正:当被除数和除数符号相同时,最后余数加除数;否则,最后余数减除数。
与无符号数的不恢复余数法一样,补码不恢复余数法也有一个六字口诀“同、1、减,异、
0、加”,运算过程也是呈加/减交替的方式,因此也称为“加减交替法”。
例3.7 已知x=-9,y=2,要求用补码除法计算[x/y]#。
解:X=[x]#=10111,Y=[y]#=00010,计算过程如下:
先对被除数进行符号扩展,即X=11111 10111,-Y=[-y]=11110。
余数寄存器 R
余数/商寄存器Q
说 明
11111
10111
开始 R=X
+00010
R?=X+y
00001
10111
R?与Y同号,故 Q?=1
00011
01111
2R?(R和Q同时左移,空出一位上商1)
+11110
R?=2R?-Y
00001
01111
R?与Y同号,故 Q?=1
00010
11111
2R?(R和Q同时左移,空出一位上商1)
+11110
R?=2R?-Y
00000
11111
R?与Y同号,故 Q=1
00001
11111
2R?(R和Q同时左移,空出一位上商1)
+11110
R?=2R?-Y
11111
11111
R?与Y异号,故Q?=0
11111
11110
2R?(R和Q同时左移,空出一位上商0)
+00010
R?=2R?+Y
00001
11110
R?与Y同号,故Q=1
00011
11101
2R?(R和Q同时左移,空出一位上商1)
-602
R?=2Rs-y
|11011
Q左移,空出一位上商。
+HHHY
十
1
R?与Y同号,故Q?=1
11100
商为负数,末位加1;减除数以修正余数
所以,[x/y]n=11100,余数为11111。
即x/y=-0100B=-4,余数为-0001B=-1。
将各数代入公式“除数×商+余数=被除数”进行验证,得2×(-4)+(-1)=-9。
3.4整数乘除运算
高级语言中两个n位整数相乘得到的结果通常也是一个n位整数,即结果只取2n位
乘积中的低n位。例如,在C语言中,参加运算的两个操作数的类型和结果的类型必须一
致,如果不一致则会先转换为一致的数据类型再进行计算。
3.4.1乘除运算溢出判断
根据二进制运算规则,在计算机算术中存在以下结论:假定两个n位无符号整数xu和
yu对应的机器数为Xu和Yu,pu=xu×yu,pu为n位无符号整数且对应的机器数为Pu;


<!-- page: 94 -->

运算方法和运算部件
两个n位带符号整数xs和ys对应的机器数为Xs和Ys,ps=xs×ys,ps为n位带符号整
数且对应的机器数为Ps。若Xu=Xs且Yu=Ys,则Pu=Ps。表3.3中给出了4位无符号
整数和4位带符号整数乘法的例子,显然这些例子符合上述结论。
表3.3 4位无符号整数和4位带符号整数乘法示例
序号
运算
x
X
y
Y
x×y
X×Y
p
P
是否溢出
1
无符号乘
6
0110
10
1010
60
### 0011 1100
12
1100
溢出
2
带符号乘
6
0110
-6
### 1010 -36
### 1101 1100
-4
1100
溢出
3
无符号乘
8
1000
2
0010
16
### 0001 0000
0
0000
溢出
4
带符号乘
-8
1000
2
### 0010 -16
### 1111 0000
0
0000
溢出
5
无符号乘
13
1101
14
1110
182
### 1011 0110
6
0110
溢出
6
带符号乘
-3
1101
-2
1110
6
### 0000 0110
6
0110
不溢出
7
无符号乘
2
0010
12
1100
24
### 0001 1000
8
1000
溢出
8
带符号乘
2
0010
-4
1100
-8
### 1111 1000
-8
1000
不溢出
因为无符号整数和带符号整数的乘积低n位完全一样,因此,在有些架构中,当取低n
位乘积时,无符号整数和带符号整数的乘法运算是同一条指令。例如,在 RISC-V架构中,
无符号整数和带符号整数的乘法指令都是mul,结果取低n位乘积。不过,多数处理器架构
都是将无符号整数和带符号整数的乘法指令完全区分开来的,例如,Intel x86的无符号整
数乘指令为 mul,带符号整数乘指令为imul。MIPS的无符号整数乘指令为multu,带符号
整数乘指令为 mult。
1.无符号整数乘的溢出判断
对于n位无符号整数x和y的乘法运算,若取2n位乘积中的低n位为乘积,则相当于
取模2"。若丢弃的高n位乘积为非0,则发生溢出。例如,对于表3.3中序号1的情况,
0110与1010相乘得到的8位乘积为00111100,高4位为非0,因而发生了溢出,说明低4
位1100不是正确的乘积。
无符号整数乘运算可用如下公式表示,式中 p是指取低n位乘积时对应的值。
-{X;?2)
如果无符号数乘法指令能够将高n位保存到一个寄存器中,则编译器可以根据该寄存器的
内容采用相应的比较指令来进行溢出判断。例如,在 MIPS架构中,无符号数乘法指令
multu会将两个 32位无符号数相乘得到的64位乘积置于两个32位内部寄存器 Hi和Lo
中,编译器可以根据Hi寄存器是否为全0来进行溢出判断。在 RISC-V架构中,无符号整
数相乘得到的高n位乘积可用乘法指令 mulhu得到,编译器根据该指令得到的结果是否为
0,来判断 mul指令的执行结果是否发生无符号整数乘溢出。
2.带符号整数乘的溢出判断
补码乘法器实现带符号整数运算时,得到的结果是2n位乘积的补码表示。例如,对于
表3.3中序号为2的情况,x=6,y=-6,得到乘积的2n位补码表示为11011100。
第3章
77


<!-- page: 95 -->

计算机组成与系统结构(第3版)
78
对于带符号整数相乘,可以通过乘积的高n位和低n位之间的关系进行溢出判断。判
断规则是:若高n位中每一位都与低n位的最高位相同,则不溢出;否则溢出。例如,对于
表3.3中序号4的情况,x=-8,y=2,得到8位乘积为11110000,高4位全1,与低4位的
最高位不同,因而发生了溢出,说明低4位0000不是正确的乘积。对于序号为6的情况,x
=-3,y=-2,得到8位乘积为0000 0110,高4位全0,且与低4位的最高位相同,因而没
有发生溢出,说明低 4位0110 是正确的乘积。
如果带符号整数乘法指令能够将高n位保存到一个寄存器中,则编译器可以根据该寄
存器的内容与低n位乘积的关系进行溢出判断。例如,在MIPS架构中,带符号整数乘法指
令 mult会将两个32位带符号整数相乘,得到的64位乘积置于两个32位内部寄存器 Hi和
Lo中,因此,编译器可以根据 Hi寄存器中的每一位是否等于Lo寄存器中的第一位来进行
溢出判断。在RISC-V架构中,带符号整数相乘得到的高n位乘积可用专门的指令 mulh
得到,编译器根据该指令得到的结果中的每一位是否等于 mul指令得到的结果中的第一
位,来判断是否发生带符号整数乘溢出。
有些指令系统中乘法指令并不保留高n位,也不生成溢出标志OF,此时,编译器就无
法进行溢出判断,甚至有些编译器根本不考虑溢出判断处理。这种情况下,程序就可能在发
生溢出的情况下得到错误的结果。例如,在C程序中,若x和y为int型,x=65 535,机器
数为0000 FFFFH,则y=x×x=-131071,y的机器数为FFFE 0001H,因而出现x2<0
的奇怪结论。
如果要保证程序不会因编译器没有处理溢出而发生错误,那么,程序员就需要在程序中
加入进行溢出判断的语句。无论是带符号整数还是无符号整数,都可根据两个乘数x、y与
结果p=x×y的关系来判断是否溢出。判断规则为:若满足x≠0且p/x=y,则没有发生
溢出;否则溢出。
例如,对于表3.3中序号7的例子,x=2,y=12,p=8,显然8/2≠12,因此,发生了溢
出。对于序号8的例子,x=2,y=-4,p=-8,显然2≠0且-8/2=-4,因此,没有发生
溢出。
3.整数除法的溢出判断
对于整数除法,只有当-2147483648/-1时会发生溢出,其他情况下,因为商的绝对
值不可能比被除数的绝对值更大,因而肯定不会发生溢出。但是,在不能整除时需要进行舍
入,通常按照朝0方向舍入,即正数商取比自身小的最接近整数,负数商取比自身大的最接
近整数。除数不能为0,否则根据C语言标准,其结果是未定义的。
3.4.2常量的乘除运算
从3.3节介绍的定点运算部件可以看出,乘法比移位和加法慢很多,除法比乘法慢很
多。因此,编译器在处理变量与常数相乘或相除时,往往以移位、加法和减法的组合运算来
代替乘除运算。例如,对于C程序中的表达式x×20,编译器可以利用20=16+4=21+22,
将x×20转换为(x<<4)+(x<<2),这样,一次乘法转换成了两次移位和一次加法。不
管是无符号整数还是带符号整数的乘法,即使乘积溢出,利用移位和加减运算组合方式得到
的结果都和直接相乘结果一样。
对于整数除法运算,由于计算机中除运算比较复杂,而且难以用流水线方式实现,所以


<!-- page: 96 -->

运算方法和运算部件
一次除法运算大致需要几十个时钟周期。为了缩短除法运算时间,编译器在处理一个变量
与一个2的幂次形式的整数相除时,常用右移实现。无符号整数除用逻辑右移,带符号整数
除用算术右移。两个整数相除,结果也一定是整数,不能整除时采用朝0舍入,即截断方式,
将小数点后的数直接去掉,例如,7/3=2,-7/3=-2。
对于无符号整数,采用逻辑右移时,高位补 0,低位移出,因此,移位后得到的商的值只
可能变小而不会变大,即商朝0方向舍入。由此可见,不管是否整除,采用移位方式和直接
相除得到的商完全一样。
对于带符号整数,采用算术右移时,高位补符号,低位移出。因此,当符号为0时,与无
符号整数相同,采用移位方式和直接相除得到的商完全一样。当符号为1时,若低位移出的
是全0,则说明能够整除,移位后得到的商与直接相除得到的商完全一样;若低位移出的是
非全0,则说明不能整除,移出一个非0数相当于把商中小数点后面的值舍去。因为符号是
1,所以商是负数,一个补码表示的负数舍去小数部分的值后变得更小,因此移位后的结果是
更小的负数商。例如,对于一3/2,假定补码位数为4,则进行算术右移操作1101>>1=
1110.1B(小数点后面部分移出)后得到的商为-2,而精确商是-1.5(整数商应为一1)。算
术右移后得到的商比精确商少了 0.5,显然朝一~方向进行了舍入,而不是朝0方向舍入。
因此,这种情况下,移位得到的商与直接相除得到的商不一样,需要进行校正。
校正的方法是,对于带符号整数除运算x/2*,若x<0,则在右移前,先将x加上偏移量
(2*-1),然后再右移k位。例如,对于一3/2,在对一3右移1位之前,先将-3加上1,即先
得到1101+0001=1110,然后再算术右移,即1110>>1=1111,此时商为-1。
例3.8 已知32位变量x的机器数为80000005H,对于C语言程序回答下列问题。
(1)当x是unsignedint类型时,x/2和x>>1的值分别是多少?2×x和x<<1的
值分别是多少?2×x和x<<1结果是否发生溢出?
(2)当x是int类型时,x/2和x>>1的值分别是多少?如何用右移操作实现x/2?
2×x和x<<1的值分别是多少?2×x和x<<1结果是否发生溢出?
解:(1)当x是unsigned int类型时,x是无符号整数,机器数80000005H的真值是
### 1000 0000 O000 0000 0000 0000 0000 0101B=23+5。
x/2的值为(231+5)/2(mod 232)=230+2。
x>>1的值为01000 0000 O000 O000 0000 0000 0000 010B=21+2。
2×x的值为(231+5)×2(mod 2)=10,因为10/2≠(231+5)说明2×x发生了溢出。
x<<1的值为0000 0000 0000 0000 0000 0000 0000 1010B=10,无符号整数左移时,
移出的是非0,故x<<1发生溢出。
(2)当x是int类型时,x是带符号整数,机器数是
### 80 00 00 05H=1000 0000 O000 O000 0000 0000 0000 0101B
根据由补码求真值的简便方法“若符号位为1,则真值的符号为负,其数值部分的各位
由补码中相应各位取反后末位加1所得”,得到x的真值为
-0111 1111 1111 1111 1111 1111 1111 1011B=-(231-1-4)=-(231-5)。
x/2的值为-(231-5)/2(mod 2)=-23°+3。
x>>1的机器数是1100 0000 0000 0000 0000 0000 0000 0010B,真值为
一011 1111 1111 1111 1111 1111 1111 1110B=-(23-1-1)=-23+2。
第3章
79


<!-- page: 97 -->

计算机组成与系统结构(第3版)
80
这里因为x/2为负数且不能整除,因而其结果与x>>1的结果不同,如果要用右移实
现除法,必须在右移前先加偏移量1,即x/2的机器数为
(1000 0000 0000 O000 0000 0000 0000 0101+1)>>1=11000 0000 0000 0000 0000 0000 0000 011
其真值为一011 1111 1111 1111 1111 1111 1111 101B=-(2-1-2)=-2”+3。
2×x的值为一(231-5)×2(mod2*)=10,因为10/2≠-2+5,说明2×x 发生了
溢出。
x<<1的值是0000 0000 0000 0000 0000 0000 0000 1010=10,带符号整数左移时,移
位后数的符号发生变化,故x<<1发生溢出。
3.5浮点数运算
从3.1节介绍的有关高级语言和机器指令涉及的运算来看,浮点运算主要包括浮点数
的加、减、乘、除运算。一般有单精度浮点数和双精度浮点数运算,有些机器还支持80位或
128位扩展浮点数运算。
3.5.1浮点数加减运算
先看一个十进制数加法运算的例子:0.123×10?+0.456×102。显然,不可以把0.123
和0.456直接相加,必须把指数调整为相等后才可实现两数相加。其计算过程如下:
0.123×10+0.456×102=0.123×10?+0.000 456×10?
=(0.123+0.000 456)×10*
=0.123 456×10?
从上面的例子不难理解实现浮点数加减法的运算规则。
设两个规格化浮点数x和y表示为x=M,×2F,y=M,×2,M,、M,分别是浮点
数x和y的尾数,E,、E,分别是浮点数x和y的指数,不失一般性,设E,≤E,,那么
x+y=(M,×22;-Es+M,)×2F;
x-y=(M,×2E;-Fy-M,)×2F>
计算机中实现上述计算过程需要经过对阶、尾数加减、规格化和舍入4个步骤,此外,还必须
考虑溢出判断和溢出处理问题。
1.对阶
对阶的目的是使x和y的阶码相等,以使尾数可以相加减。对阶的原则是:小阶向大
阶看齐,阶小的那个数的尾数右移,右移的位数等于两个阶的差的绝对值。大多数机器采用
IEEE754标准来表示浮点数,因此,对阶时需要进行移码减法运算,并且尾数右移时按原码
小数方式右移,符号位不参加移位,数值位要将隐含的一位1右移到小数部分,空出位补0。
为了保证运算的精度,尾数右移时,低位移出的位不要丢掉,应保留并参加尾数部分的运算。
可以通过计算两个阶的差的补码来判断两个阶的大小。对于IEEE 754单精度格式来
说,其计算公式如下:
[E,-E,]n=256+E,-E,=256+127+E,-(127+E,)
=256+[E,]w-[E,]w=[E,]w+[-[E,]w](mod 256)


<!-- page: 98 -->

运算方法和运算部件
2.尾数加减
对阶后两个浮点数的阶码相等,此时,可以进行对阶后的尾数相加减。因为 IEEE 754
采用定点原码小数表示尾数,所以,尾数加减实际上是定点原码小数的加减运算,可根据
3.3.2节介绍的定点原码小数加减运算进行。因为IEEE754浮点数尾数中有一个隐藏位,
所以,在进行尾数加减时,必须把隐藏位还原到尾数部分。此外,对阶过程中在尾数右移时
保留的附加位也要参加尾数加减运算。
3.尾数规格化
IEEE 754的规格化尾数形式为±1.bb⋯b。在进行尾数相加减后可能会得到各种形式
的结果,例如;
1.bb⋯b+1.bb⋯b=±1b.bh⋯b
1.bb⋯b-1.bb⋯b=±0.00⋯01b⋯b
对于上述结果为±1b.bb⋯b的情况,需要进行右规:尾数右移一位,阶码加1。最后一位移
出时,要考虑舍入。对于上述结果为±0.0⋯01b⋯b的情况,需要进行左规;数值位逐次左
移,阶码逐次减1,直到将第一位1移到小数点左边。
4.尾数的舍入处理
在对阶和尾数右规时,可能会对尾数进行右移,为保证运算精度,一般将低位移出的位
保留下来,并让其参与中间过程的运算,最后再将运算结果进行舍入,以还原表示成IEEE
754格式。
5. 溢出判断
在进行尾数规格化和尾数舍入时,可能会对结果的阶码执行加、减运算。因此,必须考
虑结果的指数溢出问题。若一个正指数超过了最大允许值(127或1023),则发生指数上溢,
机器产生异常,也有的机器把结果置为+~(数符为0时)或一~(数符为1时)后,继续执行
下去。若一个负指数超过了最小允许值(一149或-1074),则发生指数下溢,此时,一般把
结果置为+0(数符为0时)或一0(数符为1时),也有的机器引起异常。
溢出判断实际上是在上述尾数规格化和尾数舍入过程中进行的,只要涉及阶码求和/
差,就可以在阶码运算部件中直接用溢出判断电路来实现。在上述运算过程中,涉及阶码求
和/差的情况有以下两种情况。
(1)右规和尾数舍入。一个数值很大的尾数舍入时,可能因为末位加1而发生尾数溢
出,此时,可以通过右规来调整尾数和阶码。右规前应先判断阶码是否为全1,若是,则不需
右规,直接置结果为指数上溢;否则,阶码加1,然后判断阶码是否为全1来确定是否指数
上溢。
(2)左规。左规时数值位逐次左移,阶码逐次减1,所以左规使阶码减小,故需判断是否
发生指数下溢。其判断规则与指数上溢类似,首先判断阶码是否为全0,若是,则直接置结
果为指数下溢;否则,阶码减1,然后判断阶码是否为全0来确定是否指数下溢。
从浮点数加减运算过程可以看出,浮点数的溢出并不以尾数溢出来判断,尾数溢出可以
通过右规操作得到纠正。运算结果是否溢出主要看结果的指数是否发生了上溢,因此是由
指数上溢来判断的。
图3.16 是浮点数加减运算部件的逻辑结构示意图(虚线表示控制信号,图中省略了对
两个 ALU 的控制信号线)。
第3章
81


<!-- page: 99 -->

计算机组成与系统结构(第3版)
82
S
E?
M?
S,
E?
M?
小ALU
指数加减
阶差
②
③,
0
0