原码一位乘法和补码一位乘法

原码一位乘法

原码乘法遵循的规则如下

  • 将符号位与符号位进行异或运算,同时数值位的绝对值和数值位的绝对值相乘,最后将两个结果结合起来就得出了最终的值
  • 向右移位的时候高位填0

比如 A = -0.1101, B = 0.1011,求A*B的积?(详细计算过程如下图)

符号位与符号进行计算.A的符号位为-1,B的符号位为+1.两个符号进行异或运算最后的符号仍然是-1.

数值位乘以数值位.|A|=0.1101,|B| = 0.1011.我们采用双符号位来进行计算.|A| =  00.1101, |B| = 00.1011.下面是|A|*|B|的运算过程:

ACC是累加寄存器,初始值为000000,MQ是乘商计算器,存着除数B,即为001011.

第一次计算,此时MQ的值为001011,最低位为1,要乘以|A|.所以累加寄存器ACC(ACC的值为000000)加上 1 *00.1101(|A|的值) = 00.1101,再向右移动一位也就变成了00.0110.

第二次运算,MQ的最低位还是为1,ACC此时的值是00.0110加上 1 *00.1101 = 01.0011,再向右移动一位就变成了00.1001.

第三次运算MQ此时的值是11.0010,最低位是0.所以ACC的值+0*00.1101 = 00.1001,再往右移动一位变成了00.0100.

第四次计算MQ的最低位为1,ACC的值+1*00.1101 = 01.0001,再往右移动一位变成了00.1000.

因为除数B只有4位,移位运算进行到第四次就可以停止,MQ舍弃最后两位符号位,将ACC和MQ的值组合起来就是00.10001111.加上最开始异或计算的符号位最终的结果为 -0.10001111

 

         

 

补码一位乘法

比如 A = -0.1101, B = 0.1011,求A*B的积?

先计算出几个值为后续的计算做准备.

A的补码 A补 = 11.0011,-A的补码 (-A补) = 00.1101,B补 = 00.1011

补码一位乘法遵循的规则如下

  • A使用双符号位计算,B使用单符号位计算,为了保持寄存器的位数相同,MQ里面初始时存B的值并要求在末尾添加一位辅助位0
  • 向右移位的时候看符号位是什么高位就添什么
  • 出现溢出时高位舍弃
  • A*B的积 = A的补码 * B的补码的积再求补码

详细计算过程如下图.ACC初始时装着000000,MQ初始时存着单符号位B的值并在最后面添加个辅助位0,即010110.

第一次运算看MQ最后一位减去倒数第二位的值来决定加什么.比如此时MQ的值为00110,0-1 = -1.那么就要加上-A的补码.如果相减为+1,那就要加上A的补码.还有一种情况相减为0.那就加0.因此ACC的值000000 + (-A补) = 00.1101,再往右移动一位高位补0就变成了00.0110.

第二次计算MQ最后一位减去倒数第二位的值为0,因此ACC的值加0右移变成了00.0011

第三次计算MQ最后一位减去倒数第二位的值为+1,因此ACC的值加A补右移变成了11.1011

第四次计算MQ最后一位减去倒数第二位的值为-1,ACC的值加上(-A补) = 100.1000,溢出了一位舍弃掉,就成了00.1000

第五次计算MQ最后一位减去倒数第二位的值为+1,ACC的值加上A补 = 11.0111.到此结束不用移位.

由于乘数B只有4位,故只进行5次运算,并且最后一次运算只相加不移位.最终的结果为11.01110001,对其求补码就变成了11.10001111,最终的结果就是-0.10001111.

 

                             

猜你喜欢

转载自blog.csdn.net/brokenkay/article/details/108155253