解:
[X]补=1.0011[Y]补=0.0111
[X]补+[Y]补=1.0011+0.0111=1.1010
[X+Y]原=[[X]补+[Y]补]补=[1.1010]补=1.0110
所以,X+Y=-0.0110
用真值进行运算:
X+Y=-0.1101+0.0111=-0.0110
结果相同。
用补码做加法是数值位连同符号位一起参加运算的。
但是在有溢出的情况下,用一般的补码加法就得不到正确的结果,再看下面的例子。
例4.9设有两个定点小数X=+0.10111,Y=+0.10001,用补码的加法求Z=X+Y
解:
[X]补=0.10111,[Y]补=0.10001
[X+Y]补=[X]补+[Y]补=0.10111+0.10001=1.01000
Z=X+Y=-0.11000
两个大于0.5的正数相加,结果就为负值,结果显然是错误的。
例4.10设X=-0.10111,Y=-0.10001,用补码的加法求Z=X+Y
解:
[X]补=1.01001,[Y]补=1.01111
[X+Y]补=[X]补+[Y]补=1.01001+1.01111=0.11000Z=X+Y=+0.11000
两个绝对值大于0.5的负数相加,结果为正值,这也是错误的。
它们的和超出了机器数所能表示的最大范围,即产生了溢出,在有溢出的情况下,用一般补码加法就无法得到正确结果。
例4.11设有两个定点小数X=+0.10111,Y=-0.10001,用补码的加法求Z=X+Y
解:
[X]补=0.10111,[Y]补=1.01111
[X+Y]补=[X]补+[Y]补
=0.10111+1.01111=0.00110
所以,Z=+0.00110,没有发生溢出,结果是正确的。
例4.12设有两个定点小数X=-0.10111,Y=+0.10001,用补码的加法求Z=X+Y
解:
[X]补=1.01001,[Y]补=0.10001
[X+Y]补=[X]补+[Y]补=1.01001+0.10001
=1.11010
[[X+Y]补]补=1.00110
Z=X+Y=-0.00110
所以,Z=-0.00110,没有发生溢出,结果也是正确的。
2.变形补码加法
变形补码是符号位用两位来表示的补码。
变形补码的定义为:
对于变形补码,补码的加法性质公式同样适用,即:
[X+Y]变形补=[X]变形补+[Y]变形补
[[X]变形补]变形补=[X]原
用双符号位进行判断,若和的两个符号位相同(00或11),不发生溢出;若和的两个符号位相异(01或10),就说明发生了溢出。
遇到溢出,就要停机进行如下处理:
选取一个合理的比例因子H=2i,对每个加数都除以H,然后相加,其结果再乘以H,即得所求
下面我们对例4.9和例4.10用变形补码加法来求结果。
【例4.13】设X=+10111,Y=+10001,用变形补码的加法求Z=X+Y
解:
设比例因子H=2,则有
所以,
X+Y=+101000
【例4.14】设X=-10111,Y=-10001,用变形补码的加法求Z=X+Y
解:
设比例因子H=2,
则有:
所以:
X+Y=-101000
说明
⑴舍入处理在变形补码运算中,加数除以H=2i,是通过把[X]补右移I位得到的。
在移位时,末几位可能超出机器的最末位而丢失,造成误差。
为了减少误差,通常要进行舍入处理,一般有两种方法:
①恒置1。
即移位后机器末位总是1。
上面的例子就是用的恒置1的方法。
②0舍1入。
即移出去的数是0则抹去,移出去的数是1则进1到末位。
⑵符号位扩展补码在右移时,要注意符号位要一起移,且最左边一位要补上原符号位的值,这就叫做符号位扩展,即把符号位扩展到为3位。
总结以上,得出补码相加的规则:
①若两数符号不同,相加的结果即为和的补码。
②若两数符号相同,相加后若其和的符号不变,则结果是和的补码。
③若两数符号相同,相加后若其和的符号改变,则表示发生了溢出。
两个正数相加,结果的符号为“01”,表示发生正溢出;两个负数相加,结果的符号为“10”,表示发生负溢出。
4.1.3减法运算
性质3两数之差的补码等于被减数的补码与负的减数补码之和。
[X-Y]补=[X]补+[-Y]补
由性质1推导得:
[X-Y]补=[X+(-Y)]补=[X]补+[-Y]补
例4.15两个正数相减,被减数大于减数的例子。
设X=+11001,Y=+10001,求Z=X-Y。
解:
[X]补=00.11001,[-Y]补=11.01111
[X-Y]补=[X]补+[-Y]补=00.11001+11.01111=00.01000
X-Y=+01000所以,Z=+01000
例4.16两个正数相减,被减数小于减数的例子。
设X=+10011,Y=+11001,求Z=X-Y。
解:
[X]补=00.10011,[-Y]补=11.00111
[X-Y]补=[X]补+[-Y]补=00.10011+11.00111
=11.11010
X-Y=-00110
所以,Z=-00110
【例4.17】两负数相减,被减数大于减数的例子。
设X=-10011,Y=-11001,求Z=X-Y。
解:
[X]补=11.01101,[-Y]补=00.11001
[X-Y]补=[X]补+[-Y]补
=11.01101+00.11001
=00.00110
X-Y=+00110
所以,Z=+00110
【例4.18】两负数相减,被减数小于减数的例子。
设X=-11001,Y=-10011,求Z=X-Y。
解:
[X]补=11.00111,[-Y]补=00.10011
[X-Y]补=[X]补+[-Y]补=11.00111+00.10011
=11.11010
X-Y=-00110
所以,Z=-00110
4.1.4补码加减运算线路的实现
在线路实现上,若已有[Y]补,求[-Y]补可用把[Y]补每一位(包括符号位和数值位)取反,再在最低位加1来实现。
实现补码加减运算的逻辑电路如右图所示。
图中各个部件的名称和功能是:
F表示多位并行加法器,它的功能是接收参加运算的两个数X和Y,实现加法运算,并在输出端给出本次运算结果。
加法器的最低一位可以接收一个进位信号1→F。
X和Y临时存放参加运算数据的两个寄存器,X还用来保存运算的结果。
A“与”门,功能是控制寄存器X输出的内容是否送到加法器F的左输入端,用X→F信号控制。
C“与”门,功能是控制加法器F的运算结果是否写回寄存器X,用F→X信号控制。
B“与或”门,功能是通过控制信号Y→F和→F分别把Y寄存器中的内容是原数据送加法器F还是各位取反后送加法器F。
运算原理如下:
参加运算的两个数被送到寄存器X和Y,以补码的形式保存。
要实现[X+Y]补→X,需给出X→F、Y→F两个控制信号,就可以把[X]补和[Y]补送入加法器F的两个输入端,加法器再完成两个补码[X]补和[Y]补的相加。
加法完成之后,再通过F→X命令,把相加结果送入寄存器X。
若要完成[X-Y]补→X,“与”门A送出的还是[X]补,但“与或”门B送出的应是Y每一位的取反值,并在加法器的最低位加进位信号1→F,这样就得到[-Y]补,通过加法器F相加,就实现了[X]补+[-Y]补,也就是[X-Y]补。
再通过F→X命令,把[X-Y]补送入寄存器X。
4.2定点乘法及其实现
4.2.1原码一位乘法及其实现
在定点计算机中,用两个原码表示的数相乘,其乘积的符号由两数的符号位异或得到,乘积的数值部分是两数的绝对值相乘之积。
例如,有两个数X和Y,[X]原=XsX1X2…Xn
[Y]原=YsY1Y2…Yn则[X*Y]原=[X]原*[Y]原。
乘积的符号位为:
Xs⊕Ys
乘积的数值部分为:
(X1X2…Xn)*(Y1Y2…Yn)。
例如:
X=0.1001,Y=0.1101求Z=X*Y
解:
0.1001
X0.1101
1001
0000
1001
1001
0.01110101
得到相乘结果X*Y=0.01110101
在计算机中其运算规则是:
根据乘数Y绝对值每个数位上的值Yi是“1”还是“0”(从最低位Y0开始),决定本次部分积是加上被乘数X的绝对值,还是加上全“0”,得到的新部分积右移一位,再重复上面的动作,直到乘法做完为止。
【例4.20】X=+11010,Y=+10110,求Z=X*Y
解:
[X]原=0.11010,[Y]原=0.10110
乘积的符号位Z0=0⊕0=0
乘积的数值部分是两数的绝对值相乘。
开始时,部分积为全“0”。
所得结果Z=+0.1000111100。
有时部分积的符号位出现“1”,并不是出现了负数,而是部分积的值超出了“1”,右移时符号位应补“0”。
要实现原码一位乘法,乘积的符号可以用异或门实现,异或门的两个输入为相乘两数的符号,输出即为乘积的符号。
下图给出了实现原码一位乘法的逻辑电路框图,以实现对相乘两数的数值位相乘。
主要组成部件有:
寄存器A,存放计算的部分积Z,具有自动移位功能;
寄存器B,存放被乘数X;
寄存器C,存放乘数Y,具有自动移位功能;
加法器F,进行部分积和被乘数相加;
计数器i,用来控制逐位相乘的次数。
控制信号A→F、B→F分别通过与门控制部分积、被乘数送入加法器F进行相加;控制信号A/2→A、C/2→C分别控制寄存器A、C自行右移一位。
4.2.2定点补码一位乘法及其实现
假设两个数X和Y相乘,X=x0.x1x2x3…xn;Y=y0.y1y2y3…y
两个正数补码数相乘,其结果应直接得到乘积的补码:
[X]补*[Y]补=[X*Y]补
因为:
[X*Y]补=X*Y=[X]原*[Y]原=[X]补*[Y]补
那么:
X、Y为任意符号呢?
⑴当被乘数X的符号为任意,乘数Y的符号为正。
因为Y≥0,[Y]补=Y,则
[X]补*[Y]补=[X]补*Y=[X*Y]补
由于:
[X]补*[Y]补=[X]补*Y
=[X]补*(0.y1y2y3…yn)
=[X*Y]补
⑵当被乘数X的符号为任意,乘数Y的符号为负。
因为Y<0,则
(3)综上所述:
⑶BOOTH法
假设两个数X和Y相乘,X=x0.x1x2x3…xn;Y=y0.y1y2y3…y当被乘数X和乘数Y的符号都任意时侯。
[X*Y]补=[X]补*(0.y1y2y3…yn)-[X]补*y0
=[X]补*(-y0+0.y1y2y3…yn)
=[X]补*(-y0+y1*2-1+y2*2-2+y3*2-3…yn*2-n)
=[X]补*{(y1-y0)+(y2-y1)*2-1+(y3-y2)*2-2+(y4-y3)
*2-3…(yn-yn-1)*2-(n-1)+(0-yn)*2-n}
写成递推公式:
[Z0]补=0
[Z1]补=2-1*{[Z0]补+(Yn+1-Yn)*[X]补}Yn+1=0
[Z2]补=2-1*{([Z1]补+(Yn-Yn-1)*[X]补)}
[Z3]补=2-1*{([Z2]补+(Yn-1-Yn-2)*[X]补)}
┇
[Zi]补=2-1*{([Zi-1]补+(Yn-i+2-Yn-i+1)*[X]补)}
┇
[Zn+1]补=([Zn]补+(Y1-Y0)*[X]补)
最后乘积为[Zn+1]补式中,Yn+1为附加位,在Yn+1以后,Yn+1=0。
由此,可以总结出比较法补码乘法的规则:
在作补码一位乘法时,在乘数的最末位后面再加一位附加位yn+1。
开始时,yn+1=0,第一步运算是根据yn+1yn这两位的值判断后决定,然后再根据ynyn-1这两位的值判断第二步该作什么运算,再根据yn-2yn-3这两位的值判断第三步该作什么运算,如此等等。
因为每进行一步,乘数都要右移一位,yn-1yn就移到ynyn+1位置上。
作第三步时,原来的yn-2yn-1移到了yn-1yn位置上。
所以每次只要判断ynyn+1这两位的值就行。
判断规则如表4-1所示。
补码一位比较乘法规则
【例4.20】利用补码一位乘法计算Z=X*Y,其中X=-0.1101,Y=0.1011。
解:
[X]补=11.0011,[Y]补=0.1011,[-X]补=00.1101
乘积的数值部分是两数的绝对值相乘。
开始时,部分积为全“0”。
所以[X*Y]补=11.01110001,
结果Z=X*Y=-0.10001111。
部分积乘数/判别位说明
00.0000010110yn+1=0判别位10
+[-x]补00.1101部分积加+[-x]补
00.1101
00.0110101011右移1位,判别位11
00.0011010101右移1位,判别位01
+[x]补11.0011+[x]补
11.0110
11.1011001010右移1位,判别位10
+[-x]补00.1101+[-x]补
00.1000
00.0100000101右移1位,判别位01
+[x]补11.0011+[x]补
11.01110001最后一步不移位
实现一位补码乘法的逻辑原理图如图4-4所示。
它与一位原码乘法的逻辑原理图有些相似,不同的地方有以下几点:
⑴被乘数和乘数的符号位参加运算;
⑵乘数寄存器C有附加位Yn+1,其初始状态为“0”。
当乘数和部分积每次右移时,部分积最低位移入寄存器C的首位位置,所以寄存器C必须是具有右移功能的寄存器。
⑶被乘数寄存器B的每一位用原码或反码(可用触发器的Q端或端输出)经多路开关传送到加法器对应位的一个输入端,而多路开关的控制信号由Yn-1、Yn的输出译码器产生。
当Yn-1Yn=01时,送[X]补;当Yn-1Yn=10时,送[-X]补,即送寄存器B内容的反码且在加法器末位加1。
⑷寄存器A用来保存部分积,该寄存器也应具有右移的功能,其符号位与加法器的符号位始终一致。
⑸当计数器i=n+1时,封锁A/2→A,C/2→C控制信号,使最后一步不移位。
补码一位乘法逻辑原理图
4.2.3原码两位乘法
定点原码两位乘法是根据乘数中相邻两位数码的值来确定乘法的每一步作什么运算。
两位乘法的判别位是2位,即ynyn-1,共有4种可能,即00,01,10,11,其操作方法如下表所列。
【例4.22】设X=1101,Y=1001,用原码两位乘法求Z=X*Y
解:
以X为被乘数,Y为乘数,其判别位Y1Y0=01,Y3Y2=10,其两位乘法的运算过程如下:
所得结果Z=1110101。
【例4.22】用原码两位乘法求Z=X*Y,其中X=101011,Y=001001,
解:
以X为被乘数,Y为乘数,其判别位Y1Y0=01,Y3Y2=10,Y5Y4=00,其两位乘法的运算过程如下:
所得结果Z=110000011
说明:
①部分积减去被乘数X,是用补码进行运算,即用+[-X]补的方法实现。
②部分积减去被乘数所得结果一般为负数,这是因为部分积要右移2位,所以总是小于被乘数的缘故。
③当判别位为11时,要用上次部分积减被乘数,右移2位,再在下一个判别位上加1。
其原因是判别位为11(即3),应加上3倍的被乘数。
两种方法是等效的。
④符号位扩展的实质是采用几位加法器的问题。
若采用n+2位加法器,符号位扩展2位;若采用n+3位加法器,则符号位应扩展3位。
补码两位乘法(了解)
进行定点补码两位乘法,要有3位判别位,3位判别位的组合关系为:
-2Yi+Yi-1+Yi-2
它们的组合值与相应的加法操作,如下表所示
进行定点补码两位乘法运算需注意如下问题
⑴判别位。
在乘数的最低位后增加一位附加位。
乘数的符号位要视数值部分的位数来决定。
若数值部分的位数为偶数,则必须采用2位符号位;否则,就采用1位符号位。
⑵加法操作的次数。
定点补码两位乘法运算所做加法操作的次数为乘数的位数(包括符号位)除以2的值,即n/2。
⑶被乘数的符号位。
可采用2位符号位或3位符号位,视情况而定。
⑷符号位扩展。
在进行定点补码两位乘法运算中,在进行右移2位操作时,要注意符号位的扩展,即右移时符号要一起移,空出的符号位以符号的原值填充。
⑸最后一步的移位。
视乘数的符号位而定。
若符号位为2位,则不用移位;若符号位为1位,则要进行右移1位的操作。
【例4.23】设X=-1101,Y=-0101,用补码的两位乘法求Z=X*Y
解:
[X]补=11.0011,[-X]补=00.1101,[Y]补=11.1011
采用2位符号位,[X*Y]补的补码两位乘法运算过程如下:
故运算结果为:
[X*Y]补=00.01000001,所以Z=X*Y=+1000001
4.4浮点数的算术运算
4.4.1浮点数的补码加法运算
完成浮点数加减运算的步骤:
⑴对阶。
方法是,小阶向大阶看齐,阶码较小的数的尾数每向右移1位,该数阶码便加1,直到两数的阶码相同为止。
对阶时要进行舍入处理。
⑵尾数求和。
尾数连同符号相加。
⑶规格化。
若进行右规,还需要进行舍入处理。
例4.29有两个浮点数A=210(-0.110100),B=2100(+0.101011),求A+B=?
解:
①对阶。
先把A、B两数用补码表示:
[A]补=00.010;11.001100[B]补=00.100;00.101011
可以看出,[A]补的阶码小,应向[B]补阶码看齐,[A]补阶码增2,尾数向右移2位:
[A]补=00.100;11.110011
[B]补=00.100;00.101011
②尾数求和。
11110011
+00101011
100.011110
③规格化
上述结果为:
A+B=2100×(+0.011110)
这是一个非规格化的数,对上述结果规格化,即进行左规:
尾数向左移1位,阶码减1。
得到最后结果:
A+B=2011×(+0.111100)
④舍入处理
舍入处理不是对每一个题目都是必须的,主要看在对阶和右规格化尾数向右移位时,尾数的低位部分有否被丢掉。
常用的舍入方法有两种:
一种是“0舍1入”法,即如果右移时被丢掉的数位的最高位为0,则舍去;反之则将尾数的末位加“1”。
另一种是“恒置1”法,即只要有数位被移掉,就在尾数的末位恒置“1”。
4.4.2浮点数的乘法运算
浮点数乘法的运算规则是:
乘积的尾数是相乘两数的尾数之积,乘积的阶码是相乘两数的阶码之和。
结果也要进行规格化和舍入处理。
如有两个浮点数X和Y:
X=2ex·Sx
Y=2ey·Sy
则Z=X×Y=2(ex+ey)·(Sx×Sy)
在具体实现中,两数阶码的求和运算可在阶码加法器中进行,两个尾数的乘法运算,就是定点数的乘法运算。
4.4.3浮点数的除法运算
浮点数除法的运算规则是:
商的尾数是相除两数的尾数之商,商的阶码是相除两数的阶码之差。
结果也要进行规格化和舍入处理。
如有两个浮点数X和Y:
X=2ex·SxY=2ey·Sy
则Z=X÷Y=2(ex–ey)·(Sx÷Sy)
综上所述,浮点数的算术运算比定点数的算术运算要复杂许多,从运算器的结构来说,不但要有尾数运算器,而且还要有阶码运算器。
阶码运算器用来求阶差,修改阶码等等,一般只进行加减运算。
而尾数运算器不但要有加法器用以求和,还应有左移和右移的功能,以实现对阶操作和规格化操作。
4.5运算器的组成和结构
中央处理器由运算器、控制器、总线和时钟发生器等部件组成,它是计算机的核心部件。
在微型机中,中央处理器也称为微处理器,集成在一个芯片上称为CPU芯片。
运算器是计算机对数据的进行加工处理的中心,它主要有算术逻辑单元ALU、通用寄存器组、状态寄存器、数据多路选择器MUX1等组成。
4.5.1算术逻辑单元ALU
ALU的主要功能是对二进制数据进行算术运算、逻辑运算和各种移位操作。
算术运算包括定点加、减、乘和除的运算;
逻辑运算主要有逻辑与、逻辑或、逻辑异或和逻辑非操作;
移位操作主要完成逻辑左移、逻辑右移、算术左移、算术右移及其它一些移位操作。
74181是一种典型的4位ALU器件。
下页图是7