一、运算原理
定点数的乘除法都是基于移位操作来实现的
关于移位,先拿易理解的十进制举例子:00202300,现在每位上的权值是不一样的,从右往左权值依次×10,若将该十进制数的每一位数向左移以为,那么就是:02023000,结果增大了十倍,相当于×10^1,同理若向右移一位即表示÷10^1,若移动两位甚至更多位,则表示乘或除10^n,(n为移动的位数)。
现在再进一步,如何表示所有乘法?比如:123×456;(123为被乘数,456为乘数),我们可以把乘数分解成4×10^2+5×10^1+6×10^0,这样原式就变成了123×(4×10^2+5×10^1+6×10^0),再将其展开并将被乘数与每个权值前的系数相乘后移位再相加即可得出结果,我们一直使用的手算乘法就是根据这种移位的原理来计算的
现在再反观二进制乘法,原理与十进制是相同的,比如一个定点数:01001010,其所有位向左移动一位,即:1001010,结果相当于×2^1。向右移一位则是÷2^1。同样:0110×1001,可以表示为0110×(1×2^3 + 0×2^2 + 0×2^1 + 1×2^0),将其展开并将被乘数与每个权值前的系数相乘后移位再相加即可得出结果。
在计算机乘除运算中,原码左移和右移补位都补0,符号位不参与移位;反码左移和右移补位都补1,符号位不参与移位;补码可以看成最右边的1左侧为反码,右侧为原码,所以左移补位补0,右移补位补1,符号位不参与移位。
二、定点数的乘法运算
2.1 定点数的原码一位乘法运算
原码乘法运算中符号是分开单独运算的,即结果的符号=被乘数符号⊕乘数符号,数值部分则为两个数的绝对值相乘。比如:x=1001, y=1101,xy相乘过程如下:
所以结果为(1⊕1),0000101=00000101
在计算机中原码一位乘法有如下结构:
被乘数被存储在寄存器X中,乘数存储在乘商寄存器MQ中, 而运算结果则存储在ACC累加器中。
ACC初始状态为全零
①首先判断MQ的末尾位(图中加深部分),若为1,ACC加上被乘数;若为零,ACC加零;
②运算结束后ACC和MQ整体向右移位一位,因为是原码运算,所以移位后ACC左侧补位补零;
③移位后再次判断MQ末尾位,若为1,ACC加上被乘数;若为零,ACC加零;
④因为乘数只有四位,所以按此逻辑运算四次后停止;
⑤得出ACC和MQ的结果为:00000 01010,将最后一位运算符号位不参与运算,所以取从左至右的前七位为结果,最后再在结果前加上异或运算后的符号值。
2.2定点数的补码一位乘法运算
在补码的一位乘法运算中,由于补码的特殊性质,符号位是和数值位一起运算的,而且是双符号位运算(0用00表示,1用11表示),移位原则与原码移位不一样,原码为逻辑移位(补位都补零),补码为算数移位,即补码最左侧补位需与符号位值相同。
补码的一位乘法原理不是根据MQ的值来运算的,在补码运算时MQ添加了一位辅助位,辅助位初始值为零,并且为了进行双符号位的运算,ACC和寄存器X的最左侧都需多增加一位。
比如:x=1011,y=0110,现计算xy;
当辅助位-MQ末尾位=1时,ACC+[x]补;
当辅助位-MQ末尾位=0时,ACC+0;
当辅助位-MQ末尾位=-1时,ACC+[-x]补;
这里先求出[x]补=11101,[-x]补=00011;
①首先计算辅助位-MQ末尾位,按上面的情况进行不同的加法运算;
②运算结束后ACC和MQ整体右移一位,此时最左侧补位须看相加后的符号值,若为0,则补零,若为1,则补1,辅助位的值也变为移位后的值;
③移位后再次计算辅助位-MQ末尾位并按结果的值进行相应的加法运算,结束后再进行移位;
④重复上述步骤四次后还需再进行一次加法;
⑤最后得出的值即为结果
计算出来的xy用十进制表示为-18,结果正确。