两个原码数相乘,其乘积的符号为相乘两数的异或值,数值则为两数绝对值之积。
假设[X]原=X0X1X2…Xn [Y]原=Y0Y1Y2…Yn
则[X·Y]原=[X]原·[Y]原 =(X0异或Y0)|(X1X2…Xn)·(Y1Y2…Yn)
符号“|”表示把符号位和数值邻接起来。
举例:
计算过程:
在计算时,逐次按乘数每1位上的值是1还是0,决定相加数取被乘数的值还是取零值,而且相加数逐次向左偏移1位,最后一起求积。
这是我们人手工计算时进行的运算过程但是在计算机中由于数据是储存在寄存器中的所以位数是确定的不可能出现像我们人手工计算这样的直接可以调节位数的行为。所以在计算机中是不可能进行这样的运算的。
在计算机内实现原码乘法的逻辑框图有三个寄存器。其中三个寄存器A,B,C分别存放部分积、被乘数和乘数,运算方法在人工计算的基础上作了以下修改。
(1) 在机器内多个数据一般不能同时相加,一次加法操作只能求出两数之和,因此每求得一个相加数,就与上次部分积相加。
(2) 观察计算过程很容易发现,在求本次部分积时,前一次部分积的最低位,不再参与运算,因此可将其右移一位,相加数可直送而不必偏移,于是用N位加法器就可实现两个N数相乘。
(3) 部分积右移时,乘数寄存器同时右移一位,这样可以用乘数寄存器的最低位来控制相加数(取被乘数或零),同时乘数寄存器的最高位可接收部分积右移出来的一位,因此,完成乘法运算后,A寄存器中保存乘积的高位部分,乘数寄存器中保存乘积的低位部分。
举例:设X=0.1101,Y=0.1011,求X·Y。 解: 计算过程如下:取双符号位
乘法开始时,A寄存器被清为零,作为初始部分积。被乘数放在B寄存器中,乘数放在C寄存器中。实现部分积和被乘数相加是通过给出A→ALU和B→ALU命令,在ALU中完成的。ALU的输出经过移位电路向右移一位送入A寄存器中。C寄存器是用移位寄存器实现的,其最低位用作B→ALU的控制命令。加法器最低一位的值,右移时将移入C寄存器的最高数值位,使相乘之积的低位部分保存进C寄存器中,原来的乘数在逐位右移过程中丢失了。
我们可以看到是通过这样的方式来实现计算机当中的定点数原码的乘法操作的。通过移位的操作可以成功实现这样的操作。