补码乘法

补码乘法

(写的很乱,很杂,反正也没有人看 :>,就不讲究了)

起因

昨天嵌入式系统课上,老师专门讲了,补码的一系列运算.可是我没有听懂补码乘法相关的内容(补偿法?),所以自己再推一下.

前提

  1. 在不溢出的前提下,补码所表示的数可以进行正确的左移运算,并且,左移等价于乘2
  2. 补码的加法可以通过溢出保证结果的正确性,(无论对于有符号数还是无符号数)
  3. 由(1)(2)知当第二个乘数为正时,无论第一个乘数的正负号,都可以保证结果的正确性(不溢出的情况下),因为运算相当于左移和加的结合.

当第二个乘数为负数时

这里以8位二进制数乘8位二进制数,并且用16个二进制位来保存结果为例.
使用 A A A, B B B分别表示第一个和第二个乘数的绝对值,数值直接写作补码的形式,或称为unsigned 的形式(当作unsigned 时计算也是正确的).

  • 如果我们只是直接按照unsigned 进行乘.
    A × ( 2 8 − B ) = 扩展成16位 A × ( 2 16 − B ) = A × ( 2 16 − B ) m o d    2 16 = A × 2 16 m o d    2 16 − A × B m o d    2 16 = 0 − A × B m o d    2 16 = 2 16 − A × B A \times (2^8-B)\xlongequal{\text{扩展成16位}}A\times (2^{16}-B)\\ =A\times (2^{16}-B)\mod 2^{16}\\ =A\times 2^{16}\mod 2^{16}-A\times B\mod 2^{16}\\ =0-A\times B \mod 2^{16}\\ =2^{16}-A\times B A×(28B)扩展成16 A×(216B)=A×(216B)mod216=A×216mod216A×Bmod216=0A×Bmod216=216A×B
    那么我们会得到正确的结果,但是显然前面补充的符号位是没有必要的.
  • 我们以可以对 A A A, B B B进行求补,即 A × ( 2 8 − B ) = ( 2 8 − A ) × B A\times (2^8-B)=(2^8-A)\times B A×(28B)=(28A)×B
  • 补码校正法,只应用了一次取补,结论是:
    [ A × B ] 补 = A 补 × ( 0 b n − 2 b n − 3 ⋯ b 2 b 1 b 0 ) + [ − A ] 补 × 2 n − 1 × b n − 1 [A\times B]_补=A_补\times (0b_{n-2}b_{n-3}\cdots b_2b_1b_0)+[-A]_补\times 2^{n-1}\times b_{n-1} [A×B]=A×(0bn2bn3b2b1b0)+[A]×2n1×bn1
    推导:
    A × ( 2 8 − B ) = d i s c a r d   m s b 扩 展 到 16 位 ( A × ( 2 7 − B ) + C ( 补 偿 ) ) m o d    2 16 = ( A × 2 7 − A B + C ) m o d    2 16 A \times (2^8-B)\xlongequal[discard\ msb]{扩展到16位}(A\times (2^{7}-B)+C(补偿))\mod 2^{16}\\ =(A\times 2^7-AB+C)\mod 2^{16} A×(28B)16 discard msb(A×(27B)+C())mod216=(A×27AB+C)mod216
    m o d    2 16 \mod 2^{16} mod216的意义下,取 C = 2 16 − A × 2 7 C=2^{16}-A\times 2^7 C=216A×27即是 − A -A A的16位补码.

总结

在乘的时候只要保证unsigned的值合法,负数的值就是合法的,原理是同余定理,无论是unsigned还是负数在 m o d    2 16 \mod 2^{16} mod216的意义下都是相同的.

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值