补码计算的原理

首先,我个人认为,补码本质上是一种模运算,与进制无关,进制只是数的表现形式而已

以一个符号位的8位二进制数为例:
x 补 = ( x + 256 ) )    m o d    256 x_补=(x+256) )\; mod \;256 x=(x+256))mod256

所以 − 3 十进制 = 1000   001 1 二进制原码 = 1111   110 1 二进制补码 = 25 3 十进制补码 = 256 − 3 -3_{十进制}=1000 \thinspace 0011_{二进制原码}=1111 \thinspace 1101_{二进制补码}=253_{十进制补码}=256-3 3十进制=10000011二进制原码=11111101二进制补码=253十进制补码=2563
按照模运算的算法: − 3    m o d    256 = 253    m o d    256 -3 \; mod \; 256 =253 \; mod \; 256 3mod256=253mod256
所以下面我以十进制为例,演示补码可以进行加法和乘法,其中-5,-30的补码是251与226
之所以非要用十进制而不是二进制演示,我觉得十进制方便看,好理解而已

原码(十进制)补码十进制
5+65+6=115+6=(5+6)mod 256=11
5*65*6=305*6=(5*6)mod 256=30
-5+6-5+6=1原:-5+6–> 补:(256-5)+6=补:(251+6) mod 256= 补:1–>原:1
-5*6-5*6=-30原: -5*6–> 补:(256-5)*6=补:(251*6) mod 256= 补:226–>原:-30

显然补码进行四则运算是没有问题的。

证明

在这里插入图片描述

疑惑

从模运算的角度,可以知道为什么补码可以进行四则运算,但是我不能理解为什么booth算法是那么设计的?我觉得直接把补码当作无符号数进行计算,取运算结果低位,也可以得到正确的数据。所以不能理解为什么它的发明者会这么设计。
有学过数论什么的大佬吗?booth算法的设计我觉得应该也可以从数学角度找到一个它理所当然就可以这么设计的理由,可以给个证明思路吗。

这个大佬从数学角度证明了booth算法,感兴趣的可以看看,唯一的问题是我知道如何证明了,但还是不能理解,为什么它的设计者会从这个角度出发,没有一个非常理所当然该如此设计的理由。
https://blog.csdn.net/qq_45757722/article/details/111466747

多余的东西

由先前的证明,其实不难发现,如果我们把补码当作无符号数进行计算,取运算结果低位,确实可以得到正确的数据
例如 原:1_1101 *0_1011=补:1_0011*0_1011 =得到1101 0001 也就是补码1_0001 <–>原码1_1111
1_1101 *0_1011=1_1111 即-13*11=-15,这确实是正确的,其中1_1101的1是符号位,1101是数值位(这里是5位数据乘法,就取低5位)。

但是相比补码的一位乘法(booth算法),有些不同,booth算法得到的结果是1_0111 0001 对应的原码:1_100 01111,可以发现1101=13 ,1011=11,143=100 01111,13*11=143=8*32+15 =100 01111

虽然这没个球用,但感觉很有意思,,觉得booth算法的这个很像商与余数,不知道能不能通过这个弄出补码的除法运算算法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值