首先,我个人认为,补码本质上是一种模运算,与进制无关,进制只是数的表现形式而已
以一个符号位的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十进制补码=256−3
按照模运算的算法:
−
3
m
o
d
256
=
253
m
o
d
256
-3 \; mod \; 256 =253 \; mod \; 256
−3mod256=253mod256
所以下面我以十进制为例,演示补码可以进行加法和乘法,其中-5,-30的补码是251与226
之所以非要用十进制而不是二进制演示,我觉得十进制方便看,好理解而已
原码(十进制) | 补码十进制 | |
---|---|---|
5+6 | 5+6=11 | 5+6=(5+6)mod 256=11 |
5*6 | 5*6=30 | 5*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.youkuaiyun.com/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算法的这个很像商与余数,不知道能不能通过这个弄出补码的除法运算算法