概述
二进制理解了很久,写下自己的理解,我的理解细致的描述了我的思考过程,适合未理解二进制的小白,而只是回归二进制概率的,希望干错利落得到答案的,请点击二进制 百度百科
理解互补
定义一个规则,指定一个最大值,两个数相加等于这个最大值
如:我定义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