这一小节我们讲一下补码的乘法运算,通过这一小节我们会讲清楚“补码的算数右移”和“逻辑右移”的区别,以及补码一位乘法的机算和手算过程,同时同学们需要注意的是补码一位乘法最后再多来一次加法,这个加法是什么?让我们一探究竟!
补码的乘法运算
1.补码一位乘法(模拟机算)
其实补码一位乘法和原码一位乘法差不多,这里我们将原码一位乘法和补码一位乘法做一个比较
上一小节我们讲过了原码一位乘法,我们来回忆一下,乘数的最后一位乘以被乘数,得到的积加到ACC里面,然后ACC、MQ逻辑右移,舍弃乘数原来的最低位,更替乘数最低位,最后乘数符号位与被乘数符号位异或,就是最终结果的符号位。忘记同学可以看一下上一小节的内容原码的乘法运算
那补码一位乘法是怎么样的呢?补码一位乘法会根据MQ的“最低位”、辅助位来确定加什么,这个最低位有个双引号“”,这是因为其实他不是最低位,而是倒数第二位,但是因为和原码一位乘法运算有个类比,所以也叫做最低位,这里同学们主要注意一下!!
辅助位是什么?那具体是怎么根据MQ的“最低位”、辅助位的呢?又是加什么呢?带着这两个问题我们一探究竟
辅助位是在MQ后面再开辟一个单位来放辅助位,初始辅助位是0,所以说MQ的“最低位”就是倒数第二位
根据辅助位-MQ“最低位”=1时,(ACC)+[x]补
辅助位-MQ“最低位”=0时,(ACC)+0
辅助位-MQ“最低位”=-1时,(ACC)+[-x]补
ACC相加之后,ACC、MQ算数右移,ACC高位补0,MQ“最低位”、辅助位重置
需要注意的是:被乘数和ACC采用的是双符号位的补码,而MQ采用的是单符号位的补码,MQ的额外空间给辅助位了
听起来稍微有一点绕哈,接下来我们手算模拟一下补码一位乘法,相信通过这个,同学们很快会掌握的
2.补码一位乘法(手算模拟)
设机器字长为5位(含一个符号位,n=4),x=-0.1101,y=+0.1011,采用Booth算法求x*y
为了以后方便计算,我们在这先提前计算[x]补=11.0011,[-x]补=00.1101,[y]补=0.1011
[y]补后面加个辅助位,辅助位初始为0,所以[y]补=0.10110,“最低位”=1,所以这时候辅助位-“最低位”=-1,(ACC)+[-x]补=00.00000+00.1101=00.1101
得到的结果00.1101和乘数整体右移得到00.0110、低位部分积=10.1011,这时候“最低位”=1,辅助位=1,辅助位-“最低位”=0,(ACC)+0=00.0110+00.0000=00.0110
ACC和最低位部分积再往右移,得到ACC=00.0011和最低位部分积010.101,“最低位”=0,辅助位=1,辅助位-“最低位”=1, (ACC)+[x]补=00.0011+11.0011=11.0110
注意:这时候右移就要注意一下,因为这时候得到的结果11.0110符号位是1
所以这次右移,是在符号位后面补和符号位一样的1,ACC=11.1011,低位部分积=0010.1
然后还是一样的,根据“最低位”和辅助位相减得到的结果,进行相应的运算
接下来换汤不换药,直到“最低位”是符号位的时候,再进行最后一个加法运算(让乘数的符号位也参与了运算),最后得到11.01110001就是[x*y]补,则x*y=-0.10001111
一整个流程就是这样