理解 二进制 补码

概述

二进制理解了很久,写下自己的理解,我的理解细致的描述了我的思考过程,适合未理解二进制的小白,而只是回归二进制概率的,希望干错利落得到答案的,请点击二进制 百度百科

理解互补

定义一个规则,指定一个最大值,两个数相加等于这个最大值

如:我定义12为最大值,在我定义的规则中,6于6互补,5与7互补

这个规则还有一个漏洞,12为最大值了,那6+7=?,如果不定义最大值,它应该等于13
所以,需要补充定义,我定义最小值为1,6+7=1,1-12形成一个环

对这个环的理解,可以想象我们挂在墙上的时钟,12点一过就是1点,时钟指针在一个圆里旋转,这个圆就是一个环

二进制补码

目标:在硬件上,我们已经实现了二进制加法器,而在减法上,我们希望复用这个二进制加法器,把减法转化为加法

以4位2进制举例,最小值为0000,最大值为1111

0101+1010=1111,我们发现,二进制对位取反即为互补

1111+1=10000=0000,我们发现,最大值+1会等于0,因为我们只支持4位,最高位,第5位会被舍弃

我们把对位取反,称为二进制的反码

我们得到结论,一个二进制数,加上它的反码,再加上1,等于0

我们再把反码+1合并为一个动作,并把得到的结果定义一个名称,比如二进制的补码

我们把原来的二进制定义一个名称,叫做原码

综述,原码+补码=0,回想小学的知识,发现12+(-12)=0,测试一下补码是不是就是负数,因为二进制和十进制可以等价转化

原码:1010=10
补码:0101+1=0110=(-10)
原码:0101=5
计算:(-10)+5=-5=0110+0101=1011=11

我们发现结果并不是我们想要的,分析失败原因,0110是1010的补码,我们希望它能表示-10,但它同时也表示6,一个数不能表示2个数,我们需要区分一下,我们需要区分正数和负数

就先简单一下,我们认为第一位为0是正数,第一位为1为负数,而这一位,就定义为符号位,因为它代表符号,而不是具体的值

在新的规则下,最大值为0111,为7,最小值1111,为-7,太好了,我们试试7+(-7)
0111+1111=10110=0110,竟然不是0,探索真理的路,真是太可恶了

这时候,我们又发现,0111的补码为1001,0111+1001=0,所以1001应该代表-7,而不是1111代表-7,所以补码是不能直译的,必须转回原码

回到原来的测试,1111原码为1001,即-1,所以0111+1111=0110=6是正确的,而这就是我对补码全部的理解

思考

原码求补码是取反+1,补码求原码为什么也是取反+1?
先思考下

我的理解方式是
以x+(-x)=0为例
x取反+1为-x
运用换元法,令x=-x
得到(-x)+x=0
从而-x取反+1为x

你可能感兴趣的