第3 章
运算方法和运算部件
3.1 教学目标和内容安排
主要教学目标:使学生掌握核心运算部件ALU 以及计算机内部各种基本运算算法和
运算部件,能够运用所学知识分析和解释高级语言和机器级语言程序设计中遇到的各种问
题和相应的执行结果。
基本学习要求: 
(1)了解高级程序设计语言和低级程序设计语言中涉及的各种运算。
(2)掌握定点数的逻辑移位、算术移位和扩展操作方法。
(3)了解串行加法器和快速并行加法器的基本工作原理。
(4)掌握补码加减运算方法,并能设计补码加减运算器。
(5)了解原码加减运算的基本原理。
(6)了解定点数乘法和除法运算的基本思想。
(7)了解专用的阵列乘法器的基本思想。
(8)理解为何在运算中会发生溢出,并掌握各类定点数运算的溢出判断方法。
(9)掌握浮点数加减运算过程和方法。
(10)理解IEEE754标准对附加位的添加以及舍入模式等方面的规定。
(11)了解浮点数乘法和除法运算的基本思想。
(12)掌握算术逻辑单元ALU 的功能和结构。
(13)了解浮点数加减运算器的基本结构。
本章涉及各种类型数据的各种运算算法和运算电路,因此内容多而烦琐。特别是原码
加减运算和各种类型的乘除运算,它们的基本原理都很简单,但实现起来非常复杂。在课堂
教学中,这些内容往往占用很多课时,而且烦琐的步骤和一些算法规定也经常使得学生感觉
枯燥无味。这些内容在本课程内容框架体系中不属于主干内容,对这些内容掌握的好坏与
深浅程度基本不会影响学生对其他知识的学习。因此,对于原码加减运算,只要根据现实世
界中十进制加减运算规则去理解,把原理讲清楚就行了,没有必要让学生死记硬背运算规
则;对于乘法运算,只要将原码一位乘法和补码一位乘法(布斯乘法)的基本原理、两位乘算
法的基本思想以及阵列乘法器的基本思想讲清楚就行了。对于除法运算,只要将原码除法
运算的基本原理、补码除法运算的特点以及阵列除法器的基本思想讲清楚就行了。对于乘

运算方法和运算部件

第

除运算的学习,其主要目的不是学会怎样模拟计算机进行乘除运算,而是能够认识到乘除运

3

算的算法复杂性和相对较大的时间开销,并且认识到不同实现方法所用时间开销是不同的, 

章

这种不同主要是由于运算部件控制方式的不同而造成的。

课时有限的情况下,有关原码加减运算、两位乘法运算、补码除法运算、阵列乘法器、浮
点数乘除运算、浮点运算部件等加*的部分,都可以只用一两句话概括讲一下基本思想或提
出问题以引起学生进一步思考并课后阅读,无须占用大量的课堂时间来介绍细节内容。

34
为了增强学生对计算机内部各类运算算法的认识,可以让学生亲自编写相关的程序,通
过程序的执行结果来理解本章所学的知识。与本章内容相关的编程练习示例:①给定一组
无符号数和带符号整数变量的值,对其进行移位操作后,查看其结果,并进行分析解释;②
对于某个负数,如-4098,将该数赋值给一个short类型变量,然后将其转换为unsigned 
short、int、unsignedint、float等类型,查看其结果,并进行分析解释;③对于某个大的正整
数,如2147483647(即231), 将该数赋值给某个int类型变量,再将其转换为是short、
unsignedshort、unsignedint、float等类型,查看其结果,并进行分析解释;④对于某个有效

789eloaoubl

位数多于8的浮点数,如123456.5,将其定义为ft型变量,然后转换为de型变
量;再反过来将double型转换为float型,查看其结果,并进行分析解释;⑤对于各类运算, 
给出一些特殊的例子,以进行“溢出”“大数吃小数”等方面的验证,并分析结果以给出合理的
解释。例如,对于无符号数(如unsignedint), 要求计算1+4294967295 和1-4294967295; 
对于带符号整数(如int), 要求计算2147483647+1 和-2147483648-1;对于浮点数,要求
分别计算(1.0+123456.789e30)+(-123456.789e30)和1.0+(123456.789e30+ 
(-78930)), 查看两个结果是否一致,等等。

123456.e

3.主要内容提要
2 

1. 
加法器
根据进位方式的不同,有三种基本加法器:行波进位加法器、进位选择加法器和先行
(超前)进位加法器。行波进位加法器通过将多个一位全加器串行连接,各进位串行传递,速
度慢;进位选择加法器通过选择两个分别带进位0和1的高位部分加法器的输出来实现高、
低两部分的并行执行,使运算时间减半;先行(超前)进位加法器通过“进位生成”和“进位传
递”函数来使各进位独立、并行产生,速度快。可用单级、两级或更多级先行进位方式连接。
采用先行进位方式能加快加法器速度,目前多用这种方式。

2. 
算术逻辑单元(ALU)
在先行进位加法器的基础上增加其他逻辑构成ALU,以实现基本的加/减算术运算和
基本逻辑运算。ALU 有两个操作数输入、一位进位输入、一个操作控制输入、一个结果输
出、一位进位输出,以及零标志(ZF)和溢出标志(OF)等输出。

3. 
定点运算及定点运算器
定点运算由专门的定点运算器实现,其核心部件是带先行进位加法器的ALU,在控制
逻辑的控制下,可进行各种逻辑运算和算术运算。除基本逻辑运算外,主要的运算包括以下

5种。
(1)移位运算:包括逻辑移位、算术移位和循环移位。逻辑移位对无符号数进行,移位


44
计算机组成与系统结构习题解答和教学指导(第3版
) 

时,在空出的位补0,左移时可根据移出位是否为1来判断溢出;算术移位对带符号整数进
行,移位前后符号位保持不变,否则溢出;循环移位时不需要考虑溢出。左移一位,数值扩大
一倍,相当于乘2操作;右移一位,数值缩小一半,相当于除2操作。

(2)扩展运算:包括零扩展和符号扩展。零扩展对无符号数进行,高位补0;符号扩展
对带符号整数进行,因为用补码表示,所以在高位直接补符号。
(3)整数加减运算:包括补码加减、原码加减和移码加减运算。补码加减运算用于带
符号整数,符号位和数值位一起运算。同号相加时,若结果的符号不同于加数的符号,则会
发生溢出;因为IEEE754 
标准用原码小数表示尾数,所以原码加减运算用于浮点数的尾
数,符号位和数值位分开运算,同号数相加或异号数相减时做加法,同号数相减或异号数相
加时做减法;因为IEEE754 
标准用移码表示指数,所以移码加减运算用于浮点数的指数
, 
移码的和、差等于和、差的补码,因此,可通过移码先求出和、差的补码,最后将符号取反,就
能得到和、差的移码表示。减法运算电路只要在加法器基础上增加求补和溢出判断电路,并
将进位输入端用于加减控制就可实现,因此,所有的减法运算都是用加法器实现的。
(4)整数乘法运算:包括无符号数乘法、补码乘法和原码乘法,都可用加减及右移运算
实现。无符号数乘法用于无符号整数;补码乘法用于带符号整数,符号位和数值位一起运
算,可采用Booth算法或MBA 
算法;原码乘法用于浮点数尾数,符号位和数值位分开运算
, 
数值部分用无符号数乘法实现。除了可以在定点运算部件中用加法和右移来实现乘法运算
以外,也可用基于CSA 
的阵列乘法器、流水线乘法器、MBA+WT 
乘法器等实现。两个
n 
位数相乘得到2n 
位数乘积,若结果只取低
n 
位,则乘积高
n 
位必须是0(无符号数乘法)或
是符号(补码乘法)
, 
否则溢出。若采用一位乘法算法,则
n 
位数相乘大约需要
n 
次加减运
算和
n 
次右移运算。
(5)整数除法运算:包括无符号数除法、补码除法和原码除法,都可用加减及左移运算
实现。无符号数除法用于无符号整数,有恢复余数法和不恢复余数法两种;补码除法用于带
符号整数,符号位和数值位一起运算,也有恢复余数法和不恢复余数法两种;原码除法用于
浮点数尾数,符号和数值分开运算,数值部分用无符号数除法实现。因为除法运算无法事先
确定做加法还是减法,所以无法实现流水线除法器。两个
n 
位数相除时,需要将被除数扩
展成2n 
位数
, n 
位数除法大约需要
n 
次加减运算和
n 
次左移运算。
对于不恢复余数法,

4. 
浮点运算及浮点运算器
计算机中大多用IEEE754 
标准表示浮点数,因此,浮点运算主要针对IEEE754 
标准
浮点数。浮点运算由专门的浮点运算器实现,因为一个浮点数由一个定点小数和一个定点
整数组成,所以浮点运算器由定点运算部件构成,其核心部件还是带先行进位加法器的
ALU 
。浮点运算包括浮点加减运算和浮点乘除运算。

(1)浮点加减运算:按照对阶、尾数加减、规格化、舍入和溢出判断几个步骤完成。对
阶时小阶向大阶看齐,阶小的那个数的尾数右移,直到两数阶码相同,右移时一般保留两位
或三位附加位;尾数加减时用原码加减运算实现;规格化处理时根据结果的尾数形式的不同
确定进行左规或右规操作;舍入操作有就近舍入、正向舍入、负向舍入和截去4种方式,默认
的是就近舍入到偶数方式;溢出判断主要根据结果的阶码进行判断,当发生阶码上溢时,运
算结果发生溢出,当发生阶码下溢时,运算结果近似为0。
(2)浮点乘除运算:尾数用原码小数的乘/除运算实现,阶码用移码加减运算实现,需

运算方法和运算部件

第

要对结果进行规格化、舍入和溢出判断。

3 

章

3.3 
基本术语解释
54
逻辑移位(logicalshift)
逻辑移位是对无符号数进行的移位,把无符号数看成一个逻辑数进行移位操作。左
移


时,高位移出,低位补0;右移时,低位移出,高位补0。
算术移位(arithmeticshift)
算术移位是对带符号整数进行的,移位前后符号位不变。移位时,符号位不动,只是数

值部分进行移位。左移时,高位移出,末位补0,移出非符时,发生溢出。右移时高位补符, 

低位移出。移出时进行舍入操作。
循环(逻辑)移位(rotatingshift)
循环移位是一种逻辑移位,移位时把高(低)位移出的一位送到低(高)位。即左移时,各

位左移一位,并把最左边的位移到最右边;右移时,各位右移一位,并把最右边的位移到最

左边。扩
展操作(extending)
在计算机内部,有时需要将一个取来的短数扩展为一个长数,此时要进行填充(扩展)处

理。有“零扩展”和“符号扩展”两种。
零扩展(zeroextending)
对无符号整数进行高位补0的操作称为“零扩展”。
符号扩展(inetnig)

sgxedn

对补码表示的带符号整数在高位直接补符的操作称为“符号扩展”。
扩展器(extender)
扩展器是进行扩展(填充)操作的部件,一般输入为
n 
位,输出为2n 
位。
半加器(halfadder)
半加器是只考虑本位两个加数而不考虑低位进位来生成本位和的一位加法器。
全加器(fuladder,(3,2)adder)
全加器是不仅考虑本位两个加数而且考虑低位进位来生成本位和的一位加法器。
加法器(adder)
加法器是能进行
n 
位加法运算的部件。
行波进位(ripplecary)
行波进位是在进行
n 
位加法运算时,低位向高位的进位采用像“行波”一样串行传递的

方式。行
波进位加法器(ripplecaryadder)
行波进位加法器也称为串行进位加法器,它通过
n 
个全加器按照串行方式连起来实

现。进位方式采用行波进位方式。
先行进位(CaryLokAhead,CLA)
先行进位通过引入进位生成和进位传递两个进位辅助函数,使得加法器的各个进位之

间相互独立、并行产生。这种进位方式也称为并行进位方式。


64
计算机组成与系统结构习题解答和教学指导(第3版
) 

成组先行进位(BlockCaryLokAhead,BCLA)

成组先行进位将数据分成若干组,在每一组内,除了并行生成组内各位向前面的进位
外,同时还通过组进位生成和组进位传递两个组进位辅助函数,使得各组的进位也能相互独
立、并行产生。

先行进位加法器(CLAadder)

采用先行进位方式实现的加法器,也称为并行进位加法器。因为采用先行进位方式能
够快速得到和数,故也称为快速加法器。

算术逻辑部件(ArithmeticLogicUnit,ALU)

算术逻辑部件是用于执行各种基本算术运算和逻辑运算的部件,其核心部件是加法器
, 
有两个操作数输入端和低位进位输入端,一个运算结果输出端和若干标志信息(如零标志、
溢出标志等)输出端。因为ALU 
能进行多种运算,因此,需要通过相应的操作控制输入端
来选择进行何种运算。

零标志ZF,溢出标志OF,进位/借位标志CF,符号标志SF 

ALU 
部件的输出除了运算结果外,还有一组状态标志信息。例如,ZF(ZeroFlag)为
1 
时表示结果为0;OF(OverflowFlag)为1时表示结果溢出;CF(CaryFlag)为1表示在最高
位产生了进位或借位;SF(SignFlag)和符号位保持一致,若为1则表示结果为负数。

布斯算法(Both..salgorithm)

布斯算法是一种一位补码乘法算法,用于带符号数的乘法运算,由布斯(Booth)提出。
算法的基本思想是:在乘数的末位添加一个0,乘数中出现的连续0和连续1处不进行任何
运算;出现10时,做减法;出现01时,做加法。每次只做一位乘法,因而每一步都右移一位。

改进布斯算法(ModifiedBooth..salgorithm,MBA)

改进布斯算法也称为基-4Booth算法,从布斯算法推导得到,采用两位一乘,根据乘数
中连续三位的不同取值确定每一步相应的运算,每次部分积右移两位。

对阶(alignexponent)

浮点数加/减运算时,在尾数相加/减之前所进行的操作称为对阶。对阶时,需要比较两
个阶的大小。阶小的那个数的尾数右移,阶码增量。右移一次,阶码加1,直到两数的阶码
相等为止。

溢出(overflow)

溢出是指一个数比给定的格式所能表示的最大值还要大或比最小值还要小的现象。因
为无符号数、带符号整数和浮点数的位数是有限的,所以,都有可能发生溢出,但判断溢出的
具体方法不同。

阶码下溢(underflow)

在浮点数运算中,当运算的结果其指数(阶)比最小允许值还小,此时,运算结果发生阶
码下溢,即运算结果的实际值位于0和绝对值最小的可表示数之间。通常机器会把阶码下
溢时浮点数的值置为0。因此,这种情况下结果并没有发生错误,只是得到了一个近似于
0 
的值,因而无须进行溢出处理。

阶码上溢(overflow)

在浮点数运算中,当运算的结果其指数(阶)超过了最大允许值,此时,浮点数发生了上
溢。即向∞方向溢出。如果结果是正数,则发生正上溢,有的机器把值置为+∞;如果是负


运算方法和运算部件

第

数,则发生负上溢,有的机器把值置为-
∞ 
。这种情况为软件故障,通常要引入溢出故障处

3

理程序来处理。

章

规格化数(normalizednumber)

为了使浮点数中能尽量多地表示有效位数,一般要求运算结果用规格化数形式表示。
规格化浮点数的尾数小数点后的第一位一定是个非零数。因此,对于原码编码的尾数来说
, 
只要看尾数的第一位是否为1就行;对于补码表示的尾数,只要看符号位和尾数最高位是否
相反。

74
左规(etnraie)

lfomlz

在浮点数运算中,当一个尾数的数值部分的高位出现
0 
时,尾数为非规格化形式。此

时,进行“左规”操作:尾数左移一位,阶码减1,直到尾数为规格化形式为止。
右规(rightnormalize)
在浮点数运算中,当尾数最高有效位有进位时,发生尾数溢出。此时,进行“右规”操作
: 

尾数右移一位,阶码加1,直到尾数为规格化形式为止。右规过程中,要判断是否发生溢出。

此时,只要阶码不发生上溢,那么浮点数就不会溢出。
舍入(rounding)
舍入是指数值数据右部的低位数据需要丢弃时,为保证丢弃后数值误差尽量小而考虑

的一种操作。例如,定点整数“右移”时、浮点加/减运算中某数“对阶”时、浮点运算结果“右

规”时都会涉及舍入。
保护位(guardbit)和舍入位(roundingbit)
为了使浮点数的有效数据位在右移时最大限度地保证不丢失,一般在运算过程中得到

的中间值后面增加若干数据位,这些位用来保存右移后的有效数据,因此,是添加的附加位。
增设附加位后,能保证运算结果具有一定的精度,但最终附加位可能被去掉,以得到规定格
式的浮点数,此时要考虑舍入。在IEEE754标准中规定,浮点运算的中间结果可以额外多
保留两位附加位,这两位分别称为保护位和舍入位。

粘位(stickybit)
IEEE754中规定,为了更进一步提高计算精度,可以在舍入位右边再增加一位,称为

“粘位”,只要舍入位的右边还有任何非零数位,则粘位为1,否则为0。
运算器(operationalunit)
运算器即运算部件,通常指用ALU 
以及为了完成ALU 
的运算而必须与之共同工作的

各种寄存器、多路选择器和实现数据传送的总线等构成的部件。根据功能不同有定点运算

器和浮点运算器,它们是数据通路中的核心部件。
通用寄存器组(General-PurposeRegisterSet,GPRS)
CPU 
中提供了若干通用寄存器,这些寄存器可以用来存放指令操作的对象,需要在指

令中明确给出寄存器的编号,所有通用寄存器合起来构成一个通用寄存器组,也称为寄存器

堆或寄存器文件(registerfile)。通常,通用寄存器组有两个读口和一个写口。
多路选择器(multiplexer)
多路选择器是在多个输入数据中根据控制信号选择其一作为输出的部件。
桶型移位器(barelshifter)
桶型移位器是由大量多路选择器实现的快速移位器,可一次左移或右移多位,移动位数


84
计算机组成与系统结构习题解答和教学指导(第3版) 

由控制输入端给出。
Q 
乘商寄存器(Qmultiplier-quotientRegister)
Q乘商寄存器用于乘除运算。在乘法中该寄存器用来存放乘数,在除法中用来存放

商,并可以和另外的移位器共同完成左移(用于除法)或右移(用于乘法)操作。

3.常见问题解答
4 

1. 
无符号加法器如何实现? 
答:计算机中,最基本的加法器是无符号加法器。根据进位方式的不同,有三种不同的
基本实现方式:①串行进位加法器(行波进位加法器):通过
n 
个全加器按照串行方式连起
来实现;②进位选择加法器:通过选择两个分别带进位0和1的高位部分加法器的输出来
实现高、低两部分的并行执行;③并行进位加法器(先行进位加法器): 通过引入进位生成
函数和进位传递函数,使得进位之间相互独立,并行产生。也称为快速加法器。

2. 
补码加法器如何实现? 
答:两个
n 
位补码进行加法运算的规则是:两个
n 
位补码直接相加,并将结果中最高
位的进位丢掉。即采用模运算方式。显然,可用一个
n 
位无符号加法器来生成各位的和。
最终的结果是否正确,取决于结果是否溢出,只要结果不溢出,则结果一定是正确的。因此, 
补码加法器只要在无符号加法器的基础上再增加“溢出判断电路”即可。

3. 
在补码加法器中,如何实现补码减法运算? 
答:补码减法的规则是:两个数差的补码可用第一个数的补码加上另一数负数的补码
得到。由此可见,减法运算可在加法器中运行。只要在加法器的第二个输入端输入减数的
负数的补码。求一个数的负数的补码电路称为“负数求补电路”。可以通过“各位取反、末位
加1”来实现“负数求补电路”。

4. 
现代计算机中是否要考虑原码加/减运算? 
答:因为现代计算机中浮点数采用IEEE754 标准,浮点数的尾数都用原码表示,所以
在进行两个浮点数加减运算时,必须考虑原码的加减运算。

5. 
加法器的运算速度取决于什么? 
答:在门电路延迟一定的情况下,加法器的速度主要取决于进位方式,先行进位方式比
串行进位方式的速度快。

6. 
定点整数运算要考虑加保护位和舍入吗? 
答:不需要。整数运算的结果还是整数,没有误差,无须考虑加保护位,也无须考虑舍
入。但运算结果可能会“溢出”。

7. 
如何判断带符号整数运算结果是否溢出? 
答:带符号整数用补码表示,对于单符号补码(即2-补码)和双符号补码(即4-补码,变
形补码), 其溢出判断方式不同。变形补码运算的溢出判断规则是:“ 当结果的两个符号位
不同时,发生溢出”;单符号补码运算时,异号数相加不会溢出,而对于同号数相加,则有两种
判断规则。规则1是:“ 若结果的符号与两个加数的符号不同,则发生溢出”。规则2是: 

若(“) 最高位的进位和次高位的进位不同,则发生溢出”。


运算方法和运算部件
第3章
8.在计算机中,乘法和除法运算如何实现? 
答:乘法和除法运算是通过加、减运算和左、右移位运算来实现的。只要用加法器和移
位寄存器在控制逻辑的控制下就可以实现乘除运算。也可用专门的乘法器和除法器实现。
9.浮点数如何进行舍入? 
答:舍入方法选择的原则是:①尽量使误差范围对称,使得平均误差为0,即有舍有入, 
以防误差积累;②方法要简单,以加快速度。
IEEE754有4种舍入方式:①就近舍入:舍入为最近可表示的数,若结果值正好落在
两个可表示数的中间,则一般选择舍入结果为偶数;②正向舍入:朝+∞方向舍入,即取右
边的那个数;③负向舍入:朝-∞方向舍入,即取左边的那个数;④截去:朝0方向舍入, 
即取绝对值较小的那个数。
10.在C语言程序中,为什么以下程序段最终的f 值为0,而不是2.5? 
float f=2.5+1e10; 
f=f -1e10; 
答:首先,float类型采用IEEE754单精度浮点数格式表示,因此,最多有24位二进制
有效位数。因为1e10=1010=10×103×106,在数量级上大约相当于23×210×220=233,而
2.5的数量级为21,因此,在计算2.5+1e10进行对阶时,两数阶码的差为32。也就是说,2.5 
的尾数要向右移32位,从而使得24位有效数字全部丢失,尾数变为全0,再与1e10的尾数
相加时结果就是1e10的尾数,因此f=2.5+1e10的运算结果仍为1e10,这样,再执行f=f- 
1e10时结果就为0。这个例子就是典型的“大数吃小数”的例子。
3.5 单项选择题
1.8位无符号整数10010101右移一位后的值为( )。
A.01001010 B.01001011 C.10001010 D.1100101 
2.8位补码定点整数10010101右移一位后的值为( )。
A.01001010 B.01001011 C.10001010 D.11001010 
3.8位补码定点整数10010101左移一位后的值为( )。
A.10101010 B.00101010 C.00101011 D.溢出
4.8位补码定点整数10010101扩展8位后的值用十六进制表示为( )。
A.0095H B.9500H C.FF95H D.95FFH 
5.原码定点小数1.10010101扩展8位后的值为( )。
A.1.0000000010010101 B.1.1001010100000000 
C.1.1111111110010101 D.1.1001010111111111 
6.考虑以下C语言代码: 
short si=-8196; 
int i=si; 
执行上述程序段后,i 的机器数表示为( )。
A.00009FFCH B.0000DFFCH C.FFFF9FFCH D.FFFFDFFCH 
49

0 5
计算机组成与系统结构习题解答和教学指导(第3版) 

7.CPU 中能进行算术和逻辑运算的最基本运算部件是( )。
A. 多路选择器B. 移位器C. 加法器D.ALU 
8.ALU 的核心部件是( )。
A. 多路选择器B. 移位器C. 加法器D. 寄存器
9. 假定T表示一级门延迟,一个异或门的延迟为3T,则8位全先行进位加法器的关键
路径延迟为( )
。
A.6T B.8T C.16T D.17T


10. 在补码加/减运算部件中,无论采用双符号位还是单符号位,必须有() 电路,它
一般用异或门来实现。
A. 译码B. 编码C. 溢出判断D. 移位
11. 某计算机字长为8位,其CPU 中有一个8位加法器。已知无符号数x=69,38,
y=
现要在该加法器中完成x+
y 
的运算,则该加法器的两个输入端信息和输入的低位进位信
息分别为( )。

A.01000101 、00100110 、0 B.01000101 、00100110 、1 
C.01000101 、11011010 、0 D.01000101 、11011010 、1 

12. 某计算机字长为8位, 69,38,
其CPU 中有一个8位加法器。已知无符号数x=y=
现要在该加法器中完成x-
y 
的运算,则该加法器的两个输入端信息和输入的低位进位信
息分别为( )。

A.01000101 、00100110 、0 B.01000101 、11011001 、1 
C.01000101 、11011010 、0 D.01000101 、11011010 、1 

13. 某计算机字长为8位,其CPU 中有一个8位加法器。已知带符号整数x=-69,
=-38,现要在该加法器中完成x+
y 
的运算,则该加法器的两个输入端信息和输入的低位
y 
进位信息分别为( )。
A.10111011 、11011010 、0 B.10111011 、11011010 、1 
C.10111011 、00100101 、0 D.10111011 、00100101 、1 

14. 某计算机字长为8位,其CPU 中有一个8位加法器。已知带符号整数x=-69,
=-38,现要在该加法器中完成x-
y 
的运算,则该加法器的两个输入端信息和输入的低位
y 
进位信息分别为( )。
A.10111011 、11011010 、0 B.10111011 、11011010 、1 
C.10111011 、00100101 、1 D.10111011 、00100110 、1 

15. 某8位计算机中,假定
x 
和
y 
是两个带符号整数变量,用补码表示,x=63,y= 
-31,则x+
y 
的机器数及其相应的溢出标志OF 分别是( )
。
A.1FH 、0 B.20H 、0 C.1FH 、1 D.20H 、
1


16. 某8位计算机中,假定
x 
和
y 
是两个带符号整数变量,用补码表示,x=63,y= 
-31,则x-
y 
的机器数及其相应的溢出标志OF 分别是( )
。
A.5DH 、0 B.5EH 、0 C.5DH 、1 D.5EH 、
1


17. 某8位计算机中,假定带符号整数变量
x 
和
y 
的机器数用补码表示,[x]补=F5H,
[y]补=7EH,则x+
y 
的值及其相应的溢出标志OF 分别是( )。
A.115 、0 B.119 、0 C.115 、1 D.119 、1 

运算方法和运算部件

第

18. 某8位计算机中,假定带符号整数变量
x 
和
y 
的机器数用补码表示,[x]补=F5H, 
3

[y]补=7EH,则x-
y 
的值及其相应的溢出标志OF 分别是( )。
章

A.115 、0 B.119 、0 C.115 、1 D.119 、1 
19. 某8位计算机中,假定
x 
和
y 
是两个带符号整数变量,用补码表示,[x]补=44H, 
15
[y]补=DCH,则x+2y 
的机器数以及相应的溢出标志OF 分别是( )。
A.32H 、0 B.32H 、1 C.FCH 、0 D.FCH 、1 
20. 某8位计算机中,假定
x 
和
y 
是两个带符号整数变量,用补码表示,[x]补=44H,
[y]补=DCH,则x-2y 
的机器数以及相应的溢出标志OF 分别是( )。
A.68H 、0 B.68H 、1 C.8CH 、0 D.8CH 、1 
21. 某8位计算机中,假定
x 
和
y 
是两个带符号整数变量,用补码表示,[x]补=44H,
[y]补=DCH,则x/2+2y 
的机器数以及相应的溢出标志OF 分别是( )。
A.CAH 、0 B.CAH 、1 C.DAH 、0 D.DAH 、1 
22. 假定有两个整数用8位补码分别表示为r1=F5H,
r2=EEH 。若将运算结果存放
在一个8位寄存器中,则下列运算中会发生溢出的是( )。

A.r1+r2 B.r1-r2 C.r1×r2 D.r1/r2 

23. 以下关于原码一位乘法算法要点的描述中,错误的是( )。
A. 符号位和数值位分开运算,符号位可由一个异或门生成
B. 通过循环执行“加法”和“移位”操作得到乘
积
C.ALU 中是否进行部分积与被乘数的加法运算由乘数最低位决
定
D. 移位时,将进位位、部分积和乘积部分一起进行算术右移
24. 假定一次ALU 运算用1个时钟周期,移位一次用1个时钟周期,则最快的32 位原
码一位乘法所需的时钟周期数大约为( )。
A.32 B.64 C.96 D.100 
25. 以下关于Booth补码一位乘法算法要点的描述中,错误的是( )。
A. 符号位和数值位一起参加运算,无须专门的符号生成部件
B. 通过循环执行“加/减”和“移位”操作得到乘积
C. 由乘数最低两位决定对部分积和被乘数进行何种运算
D. 移位时,将进位位、部分积和乘积部分一起进行算术右移
26. 以下关于乘法运算部件的叙述中,错误的是( )。
A. 补码乘法部件可用于带符号整数的乘法运算
B. 原码乘法部件可用于浮点数中尾数相乘运算
C. 快速阵列乘法器中的基本部件包含有移位器
D. 两位乘法运算比一位乘法运算速度约快一倍
27. 对于两个
n 
位无符号整数除法运算,以下关于不恢复余数算法要点的描述中,错误
的是( )。
A. 起始时被除数在高位扩展
n 
位0,以将其扩展为2n 
位无符号整数
B. 为判断中间余数的正/负,需在余数寄存器的最高位前增加一位符号位
C. 至少需n+1 次循环执行“加/减”和“左移”操作才能得到
n 
位商
D. 运算结果一定不会发生溢出,故无须通过得到最高位商来判断溢出

25
计算机组成与系统结构习题解答和教学指导(第3版) 

28. 对于IEEE754 单精度浮点加减运算,在对阶过程中,需计算两个阶码Ex 
和Ey 
之
差的补码[ΔE 
]补。若ΔE 
≥128 或ΔE 
≤-129,则[ΔE 
]补发生溢出。假定[Ex 
]移、
[-[Ey 
]移]补和[ΔE]补的最高有效位分别记为Exs、Eys和Ebs,则相应的溢出判断方程
为( )。

A.Overflow=ExsEysEbs+ExsEysEbs 

B.Overflow=ExsEysEbs+ExsEysEbs 

C.Overflow=ExsEysEbs+ExsEysEbs 

D.Overflow=ExsEysEbs+ExsEysEbs 

29.IEEE754 单精度浮点数加减运算的对阶过程中,需要计算两个阶码Ex 
和Ey 
之差
的补码[ΔE]。假设两个浮点数分别记为[浮y],[Ex 
]、[Ey 
]和[补
补x]和[浮移移ΔE]的最高有
效位分别记为Exs、Eys和Ebs,当[ΔE]补发生溢出时,正确的处理方式是( )。

A. 中止当前程序的执行,调出相应的“溢出”异常处理程序执行
B. 当Exs为1时置最终结果为[x]浮;当Ex为0时置最终结果为[y]浮
C. 当Eys为1时置最终结果为[x]浮;当Eys y]浮为(s) 
D. 当Ebs x];当Eb0时置最终结果为[
y]为0时置最终结果为[浮为1时置最终结果为[浮
30. 若两个float型变量(用IEEE754 单精度点格式表示)
x 
和
y 
的机器数分别表示
为x=40E80000H,y=C2040000H,则在计算x+
y 
时,第一步对阶操作的结果[ΔE]补
为( )。浮(s) 
A.00000111 B.00000011 C.11111011 D.11111101 

31. 对于IEEE754 单精度浮点数加减运算,只要对阶时得到的两个阶码之差的绝对值
|ΔE|大于或等于( ), 就无须继续进行后续处理,此时,运算结果直接取阶大的那个数。
A.24 B.25 C.126 D.128 
32.IEEE754 标准提供了以下4种舍入模式,其中平均误差最小的是( )。
A. 就近舍入(中间值时强迫为偶数)
B. 正向舍入(即朝+∞ 方向舍入)
C. 负向舍入(即朝-∞ 方向舍入)
D. 截断舍入(即朝0方向舍入
)
【参考答案
】
1.A 2.D 3.D 4.C 5.B 6.D 7.D 8.C 9.A 10.C 
11.A 12.B 13.A 14.C 15.B 16.B 17.A 18.D 19.C 20.D 
21.C 22.C 23.D 24.B 25.D 26.C 27.C 28.D 29.B 30.D 
31.
B 32.
A
【部分题目的答案解析
】
第20 题


已知[补-y]=00100100B,[y]=x]补+

y]=DCH=11011100B,所以[补
x 
-2补[
[-2y]补=[x]补+[-y]补<<1=01000100+00100100<<1=01000100+01001000= 
10001100=8CH,从最后一步加操作来看,是两个正数相加,结果为负数,故溢出标志OF 为
1。综上所述,答案为选项D。


运算方法和运算部件

第

第21 
题

3

[x/2+2y]补=[x]补
> 
>1+ 
[y]补
< 
<1=01000100> 
>1+11011100< 
<1= 

章

00100010+10111000=11011010=DAH,从最后一步加操作来看,是一个正数和一个负数
相加,因此一定不会溢出。综上所述,答案为C。

35
第23 
题

关于原码一位乘法算法要点的描述中,错误的是
D 
选项中的说法:
“ 
移位时,将进位位、
部分积和乘积部分一起进行算术右移”。因为原码一位乘法算法中,数值部分和符号分开处
理,数值部分通过无符号乘的算法实现,在将进位位、部分积和乘积部分右移时,采用的是逻
辑右移,即高位补0的办法,而不是采用算术右移方式。

第24 
题

假定一次ALU 
运算用1个时钟周期,移位一次用1个时钟周期,则最快的32 
位原码一
位乘法所需的时钟周期数大约为64 
。因为32 
位原码一位乘法的循环次数为32,每次循环
中,控制逻辑根据当前乘数寄存器的最低位确定是否在ALU 
中进行加法运算,这需要一个
时钟周期;然后进行右移操作,这需要一个时钟周期。因此,每次循环需要两个时钟周期,一
共需要大约64 
个时钟周期。

第25 
题

关于布斯补码一位乘法算法要点的描述中,错误的是
D 
选项中的说法:
“ 
移位时,将进
位位、部分积和乘积部分一起进行算术右移”。因为补码一位乘法的算法中,并没有专门的
进位位,而符号位作为部分积的一部分进行处理,所以,选项
D 
的描述中提到进位位和部分
积、乘积部分一起算术右移是错误的。

第27 
题

对于两个
n 
位无符号整数除法运算,最大的商为111…11/000…01=111…11,显然,运
算结果没有产生溢出。因此,两个
n 
位无符号整数除法运算肯定不会溢出,无须通过得到
最高位商(第
n 
位商qn 
)来判断溢出,也即只要有
n 
次循环执行“加/减”和“左移”操作,就能

得到第n-1~0位的
n 
位商(1~)。因此,选项C的说法是错误的。

qn 
-q0 

第28 
题

对于IEEE754 
单精度浮点加减运算,在对阶过程中,需要计算两个阶码Ex 
和Ey 
之差
的补码[ΔE]补,[ΔE]补=[Ex 
-Ey 
]补=[Ex 
]移+[-[Ey 
]移]补。假定[Ex 
]移、[-[Ey 
]移]补
和[ΔE]补的最高有效位分别记为Exs、Eys和Ebs,若ΔE 
≥128,则[ΔE]补发生正溢出,此时
Ebs为1,而Ex 
一定为正数,即Exs=1,Ey 
一定为负数,即[Ey 
]移的符号位为0,计算
[-[Ey 
]移]补时,对[Ey 
]移的各位取反、末位加1,从而得到Eys=1,综合起来的逻辑表达式
就是ExsEysEbs;若ΔE≤-129,则[ΔE]补发生负溢出,此时Eb为0,而Ex 
一定为负数,即
Exs=0,Ey 
一定为正数,即[Ey 
]移的符号位为1,计算[-[Ey ]移(s) ]补时,对[Ey 
]移的各位取
反、末位加1,从而得到Eys=0,综合起来的逻辑表达式就是ExsEysEbs,因此,Overflow= 

ExsEysEbs+ExsEysEbs。

第29 
题

假设浮点数
x 
和
y 
的机器数分别记为[x] 
和[,[ΔE] 
]]

浮y]浮补=[Ex 
-Ey 
补=[Ex 
移
+ 
[-[Ey 
]移]补,将[Ex 
]移、[Ey 
]移和[ΔE]补的最高有效位分别记为Exs、Eys和Ebs。当[ΔE]补


计算机组成与系统结构习题解答和教学指导(第3 版) 
发生溢出时,若ΔE≥128,说明x 的阶比y 的阶至少大128,y 的尾数至少要向右移128位, 
因而y 被x“吃掉”,结果应该取x,此时Exs=1;若ΔE ≤-129,说明y 的阶比x 的阶至少
大129,x 的尾数至少要向右移129位,因而x 被y“吃掉”,结果应该取y,此时Exs=0。因
此,选项B是正确的。
第30题
x 和y 的机器数分别表示为x=40E80000H=010000001…,y=C2040000H=1100 
00100…,因此,[Ex ]移=10000001,[Ey ]移=10000100,[ΔE]补=[Ex -Ey ]补=[Ex ]移+ 
[-[Ey ]移]补=10000001+01111100=11111101。
第31题
对于IEEE754单精度浮点数加减运算,若对阶时得到的两个阶码之差的绝对值|ΔE| 
=24,则说明阶小的那个数的尾数右移24位,进行尾数加减运算时,虽然其结果的前24位
直接取阶大的那个数的相应位,但是,由于可以保留附加位,阶小的那个数右移后的尾数可
能会在舍入时向前面一位进1。例如,1.00…01×21+1.10…00×2-23=1.00…01×21+0.00… 
0011×21=1.00…0111×21。其中,加粗的两位为保留的附加位,最终需要根据这两位进行
舍入,显然,舍入后的结果为1.00…10×21,并不等于阶大的那个数。若|ΔE|=25,则保留
的附加位中,最左边第1位一定是0,采用就近舍入时,这些附加位完全被丢弃。因此,|ΔE|≥ 
25时,可以使运算结果直接取阶大的那个数。
3.6 分析应用题
1.考虑下列C语言程序代码: 
int i=65535; 
short si=(short)i; 
int j=si; 
假定上述程序段在某32位机器上执行,sizeof(int)=4,则变量i、si和j 的值分别是多
少? 为什么? 
【分析解答】
在一台32位机器上执行上述代码段时,i 为32位补码表示的定点整数,第2行要求强
行将一个32位带符号数截断为16位带符号整数,65535的32位补码表示为0000FFFFH, 
截断为16位后变成FFFFH,它是-1的16位补码表示,因此si的值是-1。再将该16位
带符号整数扩展为32位时,就变成了FFFFFFFFH,它是-1的32位补码表示,因此j 的
值也为-1。也就是说,i 的值原来为65535,经过截断、再扩展后,其值变成了-1。
2.考虑以下C语言程序代码: 
int func1(unsigned word) 
{ 
return(int)((word <<24)>>24); 
}
int func2(unsigned word) 
{ 
54

运算方法和运算部件
第3章 
return((int)word <<24)>>24; 
}
假设在一个32位机器上执行这些函数,sizeof(int)=4。说明函数func1和func2的功
能,并填写表3.1,给出对表中“异常”数据的说明。
表3.1 题2用表
w func1(w) func2(w) 
机器数值机器数值机器数值
127 
128 
255 
256 
【分析解答】
函数func1的功能是把无符号数高24位清零(左移24位再逻辑右移24位),结果一定
是正的带符号整数;而函数func2的功能是把无符号数的高24位都变成和第25位一样,因
为左移24位后左边第一位变为原来的第25位,然后进行算术右移,高位补符号,即高24位
都变成和原来第25位相同。
根据程序执行的结果填表如表3.2所示,表中机器数用十六进制表示。
表3.2 题2中填入结果后的表
w func1(w) func2(w) 
机器数值机器数值机器数值
0000007FH 127 0000007FH +127 0000007FH +127 
00000080H 128 00000080H +128 FFFFFF80H -128 
000000FFH 255 000000FFH +255 FFFFFFFFH -1 
00000100H 256 00000000H 0 00000000H 0 
因为逻辑左移和算术左移的结果完全相同,所以,函数func1和func2中第一步左移24 
位得到的结果完全相同,所不同的是右移24位后的结果不同。
表3.2中,加粗数据是一些“异常”结果。当w =128和255时,第25位正好是1,因此
函数func2执行的结果为一个负数,出现了“异常”。当w =256时,低8位为00H,高24位为
非0值,左移24位后使得有效数字被移出,因而发生了“溢出”,使得出现了“异常”结果0。
3.以下是两段C语言代码,函数arith()是直接用C语言写的,而optarith()是对arith()函
数以某个确定的M 和N 编译生成的机器代码反编译生成的。根据optarith(),可以推断函
数arith()中M 和N 的值各是多少? 
#define M 
#define N 
int arith(int x, int y) 
55

计算机组成与系统结构习题解答和教学指导(第3 版) 
{ 
int result=0 ; 
result=x*M+y/N; 
return result; 
}
int optarith(int x, int y) 
{ 
int t=x; 
x <<=4; 
x-=t; 
if(y<0) y+=3; 
y>>=2; 
return x+y; 
}
【分析解答】
对反编译结果进行分析可知,对于x,指令机器代码中有一条“x 左移4位”指令,即x 
=16x,然后有一条“减法”指令,即x=16x-x=15x,根据源程序知M =15;对于y,有一
条“y 右移2位”指令,即y=y/4,根据源程序知N =4。但是,当y<0时,对于有些y,执行
y>>2后的值并不等于y/4。例如,当y=-1时,在反编译函数optarith中执行y>>2 
时,因为-1的机器数为全1,左移两位后还是全1,即-1>>2=-1,结果为-1;而原函数
arith中执行y/4时,因为-1/4=0,得到结果为0。
对于带符号整数来说,采用算术右移时,高位补符号,低位移出。因此,当符号位为0 
时,与无符号整数相同,采用移位方式和直接相除得到的商完全一样。当符号位为1时,若
低位移出的是非全0,则说明不能整除。例如,对于-3/2,假定补码位数为4,则进行算术右
移操作1101>>1=1110.1B(小数点后面部分移出)后得到的商为-2,而精确商是-1.5,即
整数商应为-1。显然,算术右移后得到的商比精确商少了0.5,相当于朝-∞方向进行了舍
入,而不是朝零方向舍入。因此,这种情况下,移位得到的商与直接相除得到的商不一样,需
要进行校正。
校正的方法是:对于带符号整数x,若x<0,则在右移前,先将x 加上偏移量(2k -1), 
然后再右移k 位。例如,上述函数optarith中,在执行y>>2之前加了一条语句“if(y<0) 
y+=3;”,以对y 进行校正。
4.设A4~A1 和B4~B1 分别是4位加法器的两组输入,C0 为低位来的进位。当加法
器分别采用串行进位和先行进位时,写出4个进位C4~C1 的逻辑表达式。
【分析解答】
串行进位:C1=A1C0+B1C0+A1B1 
C2=A2C1+B2C1+A2B2 
C3=A3C2+B3C2+A3B3 
C4=A4C3+B4C3+A4B4 
并行进位:C1=A1B1+(A1+B1)C0 
C2=A2B2+(A2+B2)A1B1+(A2+B2)(A1+B1)C0 
C3=A3B3+(A3+B3)A2B2+(A3+B3)(A2+B2)A1B1+(A3+B3)(A2 
56

运算方法和运算部件

第

+B2)(A1+B1)C0 

3

C4=A4B4+(A4+B4)A3B3+(A4+B4)(A3+B3)A2B2+(A4+B4)(A3 

章

+B3)(A2+B2)A1B1+(A4+B4)(A3+B3)(A2+B2)(A1+B1)C0 

5.某字长为8位的计算机中,已知x=y=80,
x 
和
y 
分别存
x 
和
y 
为无符号整数
, 
68,
放在寄存器
A 
和B中。请回答下列问题(要求最终用十六进制表示二进制序列)。

75
(1)寄存器
A 
和B中的内容分别是什么
? 
(2)若
x 
和
y 
相加后的结果存放在寄存器C中,则寄存器C中的内容是什么
? 
运算
结
果是否正确
? 
加法器最高位的进位Cout是什么
? 
零标志ZF 
和进位标志CF 
各是什么
?
(3)若
x 
和
y 
相减后的结果存放在寄存器
D 
中,则寄存器
D 
中的内容是什么
? 
运算
结
果是否正确
? 
加法器最高位的进位Cout是什么
? 
零标志ZF 
和借位标志CF 
各是什么
?
(4)无符号整数加/减运算时,加法器最高位进位Cout的含义是什么
? 
它与进/借位
标
志CF 
的关系是什么
?
(5)无符号整数一般用来表示什么信息
? 
为什么通常不对无符号整数的运算结果判
断
溢出
?
【分析解答
】
y=


(1)x=68=01000100B=44H;80=01010000B=50H 
。所以,寄存器
A 
和寄
存
器B中的内容分别是44H 
和50H 。


(2)x+y=01000100+01010000=(0)10010100=94H,所以,寄存器C中的内容为
94H,对应的真值为148,运算结果正确。加法器最高位的进位Cout为0。因为结果不为0, 
所以ZF=0;进位标志CF=Cout=0。

(3)x-y=x+[-y]补=01000100+10110000=(0)11110100=F4H,所以,寄存器
D 
中的内容为F4H,对应的真值为244,运算结果不正确,这是因为相减结果为负数造成的。
加法器最高位的进位Cout为0。因为结果不为0,所以ZF=0;借位标志为CF=Cout..1=1。

(4)在加法器中进行无符号整数加法运算时,若加法器最高位进位Cout=1,则表示实
际结果大于最大可表示数255;在加法器中进行无符号整数减法运算时,若加法器最高位进
位Cout=1,则表示被减数大于减数,反之被减数小于减数。因此,在无符号数相加时,CF 
就等于Cout,表示进位;在无符号数相减时,通常将最高进位Cout取反来作为借位标志
CF 
。也就是说,无符号整数相减时,CF=Cout,CF=1表示有借位。
(5)无符号整数一般用来表示地址(指针)信息,当两个地址相加结果大于最大地址而
取低位地址时,相当于取模,即采用地址循环运算。因此,通常不需要判断其运算结果是否
溢出,即不考虑溢出标志OF 
。
6. 
假设某字长为8位的计算机中,带符号整数采用补码表示,x=-68,y=-80,
x 
和
y 
分别存放在寄存器
A 
和寄存器B中。请回答下列问题(要求最终用十六进制表示二进制
序列)。
(1)寄存器
A 
和寄存器B中的内容分别是什么
? 
(2)若
x 
和
y 
相加后的结果存放在寄存器C中,则寄存器C中的内容是什么
? 
运算
结
果是否正确
? 
加法器最高位的进位Cout是什么
? 
溢出标志OF 
、符号标志SF 
和零标志ZF
各是什么
?

85
计算机组成与系统结构习题解答和教学指导(第3版) 

(3)若
x 
和
y 
相减后的结果存放在寄存器D中,则寄存器D中的内容是什么? 运算结
果是否正确? 此时,加法器最高位的进位Cout是什么? 溢出标志OF 、符号标志SF 和零标
志ZF 各是什么? 
(4)对于带符号整数的减法运算,能否直接根据CF 的值对两个带符号整数的大小进行
比较? 
【分析解答】
(1)[-68]补=[-1000100]补=10111100B=BCH 。[-80]补=[-1010000]补=1011 

0000B=B0H 。所以,寄存器A和寄存器B中的内容分别是BCH 和B0H 。
(2)[补=[补+[补==(=最

x+y] x] y] 10111100B+10110000B1)01101100B6CH, 
高位前面的一位1被丢弃,因此,寄存器C中的内容为6CH,对应的真值为+108,结果不正
确。加法器最高位向前面的进位Cout为1。溢出标志位OF 可采用以下任意一条规则判
断得到。规则1:若两个加数的符号位相同,但与结果的符号位相异,则溢出;规则2:若最
高位上的进位和次高位上的进位不同,则溢出。对于本题,通过这两个规则都判断出结果溢
出,因此溢出标志OF 为1,说明寄存器C中的内容不是正确的结果。x+
y 
的正确结果应
是-68+(-80)=-148,而运算的结果为108,两者不等。其原因是因为x+
y 
的值(即
-148)小于8位补码可表示的最小值(即-128), 即结果发生了溢出;结果的第一位(最高
位)0为符号标志位SF,即SF=0,表示结果为正数;因为结果不为0,所以零标志ZF=0。

(3)[x-y]补=[x]补+[-y]补=10111100B+01010000B=(1)00001100B=0CH, 
最高位前面的一位1被丢弃,因此,寄存器D中的内容为0CH,对应的真值为+12,结果正
确。加法器最高位向前面的进位Cout为1。两个加数的符号位相异一定不会溢出,因此溢
出标志OF=0,说明寄存器D中的内容是真正的结果;结果的第一位(最高位)0为符号标志
位SF,即SF=0,表示结果为正数;因为结果不为0,所以零标志ZF=0。

(4)对于带符号整数的减法运算,无法直接根据CF 的值判断两个带符号整数的大小。
例如,对于x=-68,80,[y] x]-补=1)
y=x-补=[补+[y] 10111100B+10110000B=(
01101100B,得到的Cout为1,因此,CF=Cout..1=0,表示没有借位,推断出被减数应该大
于减数,即-68>80,显然这是不正确的。因此,带符号运算中不考虑CF 标志。

7. 某计算机标志寄存器包含4个标志位:CF 为进/借位标志;OF 为溢出标志;SF 为符
号标志;ZF 为零标志。请说明在无符号数和带符号整数两种情况下,以下各种比较运算的
逻辑判断表达式。
(1)等于(2)大于(3)小于(4)大于或等于(5)小于或等
于
【分析解答
】
要比较两个数的大小,通常对这两个数先做减法,根据相减的结果生成相应的标志位
,
最后根据标志位判断大小。在无符号数相减时,一般不考虑SF 和OF 标志;在带符号整数
相减时,一般不考虑CF 标志。
假设被减数的机器数为
X 
,减数的机器数为Y,则在加法器中计算两数的差时,计算公
式为X-Y=X+(-Y)补。以下举两个例子来说明。

假定X=1001,Y=1100,则在4位加法器中执行以下运算:1001-1100=1001+0100= 
(0)1101 。若是无符号数比较,则是9和12 相比,显然,ZF=0,CF=1;若是带符号整数(补
码表示), 则是-7和-4比较,显然,ZF=0,OF=0,SF=1。


运算方法和运算部件

第

假定X=1001,0100, -==

Y=则在4位加法器中执行以下运算:100101001001+1100

3

(1)0101 。若是无符号数比较,则是9和4相比,显然,ZF=0,CF=0;若是带符号整数,则是

章

-7和4比较,显然,ZF=0,OF=1,SF=0。
以下分别说明无符号数和带符号整数两种情况下各种比较运算的逻辑判断表达式。
在无符号数的情况下: 

95
(1)等于:相减后结果为零,即F=ZF 。
(2)大于:没有借位且相减后不为0,即F=CF·ZF=CF+ZF 。
(3)小于:有借位且相减后不为0,即F=CF·ZF 。
(4)大于或等于:没有借位或相减后结果为0,即F=CF+ZF 。
(5)小于或等于:有借位或相减后结果为0,即F=CF+ZF 
。
在带符号整数的情况下
:
(1)等于:相减后结果为零,即F=ZF 。
(2)大于:相减后结果不为0,并且,不溢出时为正,溢出时为负,即
F 
=ZF· 
(SF..OF)。
(3)小于:相减后结果不为0,并且,不溢出时为负,溢出时为正,即
F 
=ZF·(SF.. 
OF )。
(4)大于或等于:相减后结果为0,或者,不溢出时为正,溢出时为负,即
F 
= 
ZF+(SF..OF)。

(5)小于或等于:相减后结果为0,或者,不溢出时为负,溢出时为正,即
F 
=ZF+ 
(SF..OF )。
可以对照上述判断表达式,验证上述例子。无符号整数9和12 是小于关系,相减后得
到的标志ZF=0,CF=1,故F=CF·ZF=1。无符号整数9和4是大于关系,相减后得到的
标志CF=0,ZF=0,故F=CF·ZF=1。带符号整数-7和-4是小于关系,相减后得到的
标志ZF=0,OF=0,SF=1,故F=ZF·(SF..OF)=1。带符号整数-7和4是小于关系, 
相减后得到的标志ZF=0,OF=1,SF=0,故F=ZF·(SF..OF)=1。

8. 填写表3.注意对比无符号数和带符号整数的乘法结果, 截断操
作后的结果。
3, 以及截断操作前、

表3.题8用表

3 

模式
x y 
x×y(截断前) x×y(截断后) 
机器数值机器数值机器数值机器数值
无符号数110 010 
二进制补码110 010 
无符号数001 111 
二进制补码001 111 
无符号数111 111 
二进制补码111 111 


计算机组成与系统结构习题解答和教学指导(第3 版) 
【分析解答】
根据无符号数乘法运算和补码乘法运算算法,填写表3.4。
表3.4 题8中填入结果后的表
模 式
x y x×y(截断前) x×y(截断后) 
机器数值机器数值机器数值机器数值
无符号数110 6 010 2 001100 12 100 4 
二进制补码110 -2 010 +2 111100 -4 100 -4 
无符号数001 1 111 7 000111 7 111 7 
二进制补码001 +1 111 -1 111111 -1 111 -1 
无符号数111 7 111 7 110001 49 001 1 
二进制补码111 -1 111 -1 000001 +1 001 +1 
对表3.4中结果分析如下。
(1)对于两个相同的机器数,作为无符号数进行乘法运算和作为带符号整数进行乘法
运算,因为其所用的乘法算法不同,所以,乘积的机器数可能不同。但是,从表中看出,截断
后的乘积是一样的,即不同的仅是乘积中的高n 位,而低n 位完全一样。
(2)对于n 位乘法运算,无论是无符号数乘法还是带符号整数乘法,若截取2n 位乘积
的低n 位作为最终的乘积,则都有可能结果溢出,即n 位数字无法表示正确的乘积。虽然
表中给出的带符号整数乘积截断后都没有发生溢出,但实际上还是存在溢出的情况,例如, 
011×011=001001,截断后011×011=001,显然截断后的结果发生了溢出。
(3)表3.4中加粗的地方是截断后发生溢出的情况。可以看出,对于无符号整数乘法, 
若乘积中高n 位为全0,则截断后的低n 位乘积不发生溢出,否则溢出;对于带符号整数乘
法,若高n 位中的每一位都等于低n 位中的第一位,则截断后的低n 位乘积不发生溢出,否
则溢出。
9.考虑以下C语言程序代码: 
int func1(unsigned short si) 
{ 
return(si*256); 
}i
nt func2(unsigned short si) 
{ 
return(si/256); 
}i
nt func3(unsigned short si) 
{ 
return(((short)si*256)/256); 
}i
nt func4(unsigned short si) 
{ 
return(short)((si*256)/256); 
} 
60

运算方法和运算部件

第

请回答下列问题: 

3

(1)假设计算机硬件不提供乘除运算功能,能否用移位运算实现上述函数功能? 函数
章

func1、func2、func3和func4得到的结果各有什么特征? 

(2)填写表3.5(要求机器数用十六进制表示), 并对表中的“异常”数据进行分析。
16
表3.题9用表

5 

si 
func1(si) func2(si) func3(si) func4(si) 
机器数值机器数值机器数值机器数值机器数值
127 
128 
255 
256 
65535 

(3)对于函数func1来说,用一位乘运算所花的时间开销大约是用移位运算的多少倍? 
对于函数func2来说,用不恢复余数除法所花的开销大约是用移位运算的多少倍? 
【分析解答】

(1)编译器在处理变量与常数相乘时,往往以移位、加法和减法的组合运算来代替乘法
运算。例如,对于表达式x*20,编译器可以利用20=16+4=24+22,将x*20 转换为
(x<<4)+(x<<2), 这样,一次乘法转换成了两次移位和一次加法。不管是无符号整数
还是带符号整数的乘法,即使乘积溢出时,利用移位和加减运算组合的方式得到的结果都是
和采用直接相乘的结果是一样的。
为了缩短除法运算的时间,编译器在处理一个变量与一个2的幂次形式的整数相除时, 
常采用右移运算来实现。无符号整数除法采用逻辑右移方式,带符号整数除法采用算术右
移方式。两个整数相除,结果也一定是整数,在不能整除时,其商采用朝零方向舍入的方式, 
也就是截断方式,即将小数点后的数直接去掉,例如,7/3=2,-7/3=-2。

对于无符号整数来说,采用逻辑右移时,高位补0,低位移出,因此,移位后得到的商的
值只可能变小而不会变大,即商朝零方向舍入。因此,不管是否能够整除,采用移位方式和
直接相除得到的商完全一样。但是,对于带符号整数
x 
来说,如题3的分析解答中所说的
那样,当计算x/2k 
时,若x<0,则不能直接将
x 
算术右移
k 
位,而应该先将
x 
加上偏移量
(2k 
-1), 然后再算术右移
k 
位。

因为256=28,所以题目给出的函数中的乘、除运算可以分别用左、右移运算来实现。
可用“左移8位”代替“乘256”的操作,用“右移8位”代替“除以256”的操作。func1(si)相
func2(si)

当于将si逻辑左移8位,结果的最后8位都为0;相当于将si逻辑右移8位,结果
的范围是0~fn3(i) i先算术左移8位, 所以结果的范围

255;ucs相当于将s再算术右移8位, 
是-128127;ucs相当于将s再逻辑右移8位,最后以带符号整数

~fn4(i) i先逻辑左移8位, 
类型返回。因为最后是逻辑右移,高位补0,所以,返回的总是正数,结果的范围是0~255 。

(2)函数fuc1、uc2、ucunc6所示。
nfnfn3和f4的执行结果填表如表3.