符号定点二进制小数(Qnformat)乘法原理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

符号定点⼆进制⼩数(Qnformat)乘法原理
⽆符号整数⼆进制乘法很简单,基本上就是补位到位数相同,然后乘数中的每⼀位与另⼀个乘数的每⼀位做AND(与)运算,然后移位累加就可以了。

那么把⽆符号⼆进制整数乘法拓展到⽆符号⼆进制⼩数乘法,就涉及⼩数格式的问题。

这⾥说定点⼆进制⼩数格式:Qn format;⼩数点位于第 n 位元之右侧,称为Qn 格式。

Q3.3就是3位整数3位⼩数。

乘数A是Qm.n整数部分m位,⼩数部分n位; 乘数B是Qo.p,整数部分o位,⼩数部分p位;那么积A*B 就是Q(m+o).(n+p),整数部分(m+o)位,⼩数部分(n+p)位;按照⽆符号⼆进制整数乘法进⾏,然后把输出从低到⾼按照位数划分整数和⼩数部分就可以得到正确的结果。

现在把⽆符号⼆进制整数乘法拓展到考虑符号的整数⼆进制乘法,这就涉及⼆进制符号位,补位的问题了。

考虑符号⼆进制整数,最⾼位是符号位,1表⽰负数,0表⽰正数。

负数的补码是所有位取反(反码)然后加1,正数的补码是正数本⾝。

1111是负数,它表⽰-1,它的补码是0001(反码加⼀后最⾼位溢出舍去),所以负数⼆进制的数值是补码视为正数的相反数。

符号位权位-
2^(n-1)——n为⼆进制数的位数,计算符号⼆进制数的⼗进制也可以⽤权来计算。

(1111)2=1*(-2^3)+1*2^2+1*2^1+1*2^0=-8+4+2+1=-1;
另外还需强调⼀点,就是符号⼆进制数的补位。

我们都知道不同位数⽆符号⼆进制数进⾏运算需要在位数⼩的数前⾯补0,例如⽆符号数1011和100相加,变成1011和0100相加,因为显然,100和0100, 00100, 000100都是相等的,⾼位补0产⽣0*2^(n),不对原始数值有影响。

但是负数⼆进制数的补位是要在⾼位补1:直接解释,假设仅要增补1位,如果不是1就改变了负数为正数。

由此递推到补n位,都是补1;也可以从权的⾓度来说明……
符号⼆进制数的计算需要考虑每个乘数分别的符号,可以分为:正数*正数,正数*负数,负数*正数,负数*负数
正数*正数:正常运算就⾏了,依次与然后移位累加。

正数*负数:负数的最后⼀位(最⾼位,也就是符号位)与正数乘法时,需要取反码加1然后最⾼位补⼀位1;⽰意图:
上图这⾥01001是正数,10010是负数,负数从低位开始直到最后⼀位之前(第3⾏到第6⾏),都是正常的与运算然后移位;当最后⼀位(第7⾏)时直接把正数取反加1 (01001 变为10111),并补⼀位1 (10111变为110111,因为5位*5位,应该是10位,补1补到10位)。

到此再进⾏累加,就可以得到正数*负数的结果。

负数*正数:正常进⾏正数的每⼀位与负数与运算,然后移位排列,如果正数某⼀位是1,那么这次结果要在累加前⾼位补1;⽰意图:
上图这⾥101001是负数,100010是正数,实际上应该是1101001和0100010做乘法,但是事先声明100010是正数了。

遇到正数某⼀位是1的情况,把这⼀次的结果在累加前⾼位补1(第4⾏,第8⾏),其余正常补0,最后累加就得到正确结果。

负数*负数:遇到被乘负数某⼀位有1,那么这次结果在⾼位补1;直到最后⼀位,取补码⾼位补0;⽰意图:
上图11001和10010都是负数,当被乘数10010遇到某⼀位是1时(第4⾏),把这⼀位的结果进⾏⾼位补1;直到最后⼀位,把乘数(11001)取补码(11001到00111),然后不满⾜位数就补0(00111到000111,5位*5位是10位,结果超过10位就溢出舍去),再累加就得到正确结果。

这⾥建议⼿写⼀下11*11也就是(-1)*(-1)。

如果m位符号⼆进制整数*n位符号⼆进制整数,结果应该是2*max(m,n)位,⾼位舍去。

现在进⼊正题,讨论符号定点⼆进制⼩数的乘法,⼩数格式依然是Qn format,按照上⽂符号整数⼆进制乘法进⾏,然后:乘数A是Qm.n 符号位1位,整数部分m-1位,⼩数部分n位; 乘数B是Qo.p,符号位1位,整数部分o-1位,⼩数部分p位;那么积A*B 就是Q(m+o).(n+p),整数部分(m+o-2)位,⼩数部分(n+p)位,剩下⾼位都是补位的符号位;按照符号⼆进制整数乘法进⾏,然后把输出从低到⾼按照位数划分整数和⼩数部分就可以得到正确的结果。

这⾥建议⼿写⼀下1.1*1.1也就是(-0.5)*(-0.5)。

可以直接看开头提到的原贴。

相关文档
最新文档