转自:http://ep02.blog.163.com/blog/static/67655853200821842019254/
本文适用于补码表示的定点小数或定点整数乘法运算(硬件或软件实现)
先考查两个补码乘法运算的例子
例1: 已知 X=0.1011,Y=0.0001(真值)
[X]补=01011 , [Y]补= 00001
[X*Y]补=000001011
[X]补*[Y]补=000001011
这时有,[X*Y]补=[X]补*[Y]补
例2: 已知 X=0.1011,Y= - 0.0001(真值)
[X]补=01011 , [Y]补= 11111
[X*Y]补=111110101
[X]补*[Y]补=101010101
显然,[X*Y]补≠[X]补*[Y]补
对两个正数来说,它们补码的乘积等于它们乘积的补码。若乘数是负数时,这种情况就不成立了。
原码乘法的主要问题是符号位不能参加运算,单独用一个异或门产生乘积的符号位。故自然提出能否让符号数字化后也参加乘法运算,补码乘法就可以实现符号位直接参加运算。
为了得到补码一位乘法的规律,先从补码和真值的转换公式开始讨论。(以纯小数为例)
1.补码与真值的转换公式
设[x]补=x0.x1x2…xn,有:
n
x = -x0+∑xi2-i
i=1
等式左边x 为真值。此公式说明真值和补码之间的关系。
2. 补码的右移
正数右移一位,相当于乘1/2(即除2)。负数用补码表示时,右移一位也相当于乘1/2。因此,在补码运算的机器中,一个数不论其正负,连同符号位向右移一位(即符号扩展),若符号位保持不变,就等于乘1/2。
3. 补码乘法规则
设被乘数 [x]补=x0.x1x2…xn和乘数[y]补=y0.y1y2…yn(注意:包括符号位共n+1位)均为任意符号,则有补码乘法算式
n
[x·y]补= [x]补·( -y0+∑yi2-i)
i=1
为了推出串行逻辑(递推),实行分步算法,将上式展开加以变换:
[x·y]补= [x]补·[ -y0+y12-1+y22-2+ … +yn2-n]
= [x]补·[ -y0+ (y1-y12-1) + (y2