补码的进一步理解

引:

昨天做了一个任意数位数字的计算(公布源码),对于补码有了更深入的理解,特记录。
之前接触补码的时候觉得补码规则复杂,难以理解,为啥减去一个数就等于加上它的补码。
做了减法之后,才发现这种思路很自然。

百度百科链接如下:
百度百科对补码的描述

举个栗子:

让我们从最熟悉的十进制分析一下,先看一个十进制减法
123-234=-111;
一般人的计算思路肯定是这样的:
-(234-123)=-111;
即用大数减去小数,再取其相反数。

但是如果我们直接减的话会发生什么呢?
最上面的借表示借位。不好意思没把笔带回来,我知道很丑最上面的“借”表示借位。不好意思没把笔带回来,我知道很丑

可以看出,在不停的借位,相减之后,最终得到的结果是889,同时还向千位借了1,也就是借了1000.
那我们接下来是不是要用889-1000呢。
在这里插入图片描述
这样直接相减的思路实质是什么呢?
123-234=123+(-234)=123+(1000-234)-1000=123+766-1000=889-1000=-111;
在这里,766也就是(1000-234),就是-234的补码;而其中求出的889,也就是(1000-111),就是-111的补码。

论述:

我们用“减去一个数就是加上它的补码”来计算,得到的是889,也就是真正结果(-111)的补码。在得到889之后,想要得到真正的结果还需要再次取补。即1000-889=-111;
这就是所谓的正数(123)的补码是其本身,负数(-234)的补码需要求补。
这就是为什么减去一个数等于加上这个数的补码。只不过得到的是结果的补码。
值得注意的是:在八位二进制中,溢出的高位会被舍弃,相当于我们刚才看到的889-1000.

再举个栗子:

让我们再看一个二进制求补
求-5的补码。
-5对应正数5(00000101)→所有位取反(11111010)→加1(11111011)
这里的“所有位取反---->加一” 就是取补,相当于十进制的 用1000-234,只是在二进制中表现为用2^8-5。
最上面彩色的表示借位最上面彩色的表示借位

“所有位取反”表达的是:十进制中的 用999-234,在二进制中就是1111,1111-0000,0101.
因为所有位(8)能表达的最大数字是1111,1111,也就是2^8-1。那为什么是“所有位取反”呢?因为在二进制中,1-0=1,1-1=0,即减法的结果就是 减数取反,因为答案不是0就是1;
所以“所有位取反---->加一” ,在十进制中就是(1000-1)-234+1,在二进制中就是(2^8-1)-5+1;
所谓“取反加一”只是对于二进制来说方便计算的一种表示,对于其他位数取反应该表述为“取补加一”。

发布了9 篇原创文章 · 获赞 0 · 访问量 90

猜你喜欢

转载自blog.csdn.net/weixin_45246477/article/details/105174958