表8.12符号—幅值表示法的加减法举例该RTL代码的硬件实现。图8.10符号—幅值加减法的硬件实现8.2.1.2乘法和除法符号—幅值表示法的乘除法与非负数码的乘除法几乎完全相同,唯一不同的是它必须设置结果的符号。对计算CU←X×Y的非负数码移位——相加乘法算法稍加修改,就可以得到下列RTL代码,它进行符号—幅值数据XsX和YsY的乘法。1:Us←Xs⊕Ys,Vs←Xs⊕Ys,U←0,i←nY02:CU←U+X2:i←i-13:shr(CUV),cir(Y)Z’3:GOTO2ZT3:Us←0,Vs←0Z3:FINISH←1当UV=0时T=1,否则T=0。当i=0时,Z=1。下表列出了该RTL代码执行(-13)×(+11)的步骤。表8.13符号—幅值的移位—相加乘法的RTL代码轨迹类似于无符号非负数码乘法13×11,唯一不同的是多了设置结果符号Us和Vs的操作。该RTL代码的硬件实现。(略)除法可采用恢复余数算法或不恢复余数算法实现。与乘法相同,它也必须考虑结果的符号。因此乘法的RTL代码中所做的修改同样适用于除法的RTL代码。修改后的除法RTL代码。(略)8.2.2符号—补码表示法(signed_two’scomplementnotation)类似于符号—幅值表示法,符号—补码表示法也包括1位的符号和n位的幅值,它同样被表示为XsX。唯一不同的是其负数的幅值采用2的补码表示。+5和–3的符号—补码表示分别为:0(符号)0101和1(符号)1101符号—补码表示法的幅值部分等价于无符号表示法中的补码。为了加减两个符号—补码表示的数据,我们简单地把符号位当成幅值的最高位。例如,不将+5表示为0(符号)0101,而是简单地将其看成5位的值00101;这样,可以把符号—补码表示法的加减法转换为无符号补码的加减法。不过注意要使用(n+1)位的补码。把符号位看成幅值的最高位的另一个好处是:在执行补码加减法的同时能得出结果的符号。此时的溢出判断同补码加减法的溢出判断相同,即当最高位的进位输入和进位输出不相等时产生溢出。注意此时的最高位为符号位。乘法也可以采用相同的方式实现。一旦把符号位看成它们的相对幅值的最高位,我们就能采用booth’s算法实现数据的乘法。除法也可以通过类似的方法,修改无符号补码除法来实现。8.3BCD码(binarycodeddecimal)上一节介绍的带符号表示是用二进制位来表示二进制数。这种表示的存储效率最高,因为每一比特都表示一个唯一有效的值。但在某些应用中,直接使用十进制来存储和运算将更为适合。例如,一个数字钟的应用,它的输出必须总是表示为十进制数,但内部元件可以采用二进制计时。此时如能使用一序列十进制数的存储格式,将可免去进制转换的麻烦。用来表示十进制数的最常用格式是BCD码(binarycodeddecimal,“以二进制编码的十进制”,简称BCD)。本节将讨论BCD码的格式,及其加、减、乘、除算法和相应的硬件实现。8.3.1BCD码的格式BCD码用4位等值的二进制数表示一个十进制数字。例如,0000表示0,1001表示9。BCD码中不使用大于9的4位二进制数,从1010到1111。n位的十进制数用n组4位二进制数保存。例如,27被存为00100111(在二进制中,它被存为00011011)。BCD码是一种带符号表示法,它的值可以为正也可以为负或0。类似于符号—幅值表示法,它有两个部分:1位用于表示符号,而幅值部分保存数的绝对值。例如+27和–27分别表示为0(符号)00100111和1(符号)00100111。8.3.2加法和减法BCD码与符号—幅值表示法仅有两个不同,只要对这两个不同进行修改,就可以得到BCD码加减法的算法。首先要改变硬件以适应BCD码的加法。若BCD码的两个数字之和大于9,要将二进制加法器产生的结果加6以得到正确的结果。图8.11显示了两个BCD数字相加产生正确BCD码结果和进位的硬件(一位BCD加法器)。例如,5+6=0101+0110=1011(无效数字)。8+9=1000+1001=1(进位)0001,即11。第二个修改是对补码进行修改。BCD码的补码是9的补码。该值可以通过将999……99(n个9)减去