透彻理解补码
说在前面的话:
对于补码多数人都是大学里面深深印在脑子里的一句话"正数的补码是其本身,负数的补码是符号位不动,其余位按位取反加1",对于这句话当时并没有想太多,理性对自己的感性说"就是这么规定的,不要多想了".后来看书又接触到了补码,不禁想想这句话和补码的原始定义究竟如何贯通呢?
正文开始:
人产生了疑惑,觉着不通透,根本是感性和理性不能贯通了,前面关于求出负数补码是一种感性理解,当遇到了真正数学对于补码的定义,二者不能互相融会贯通,就不爽了,那么下面看一下补码的数学定义.
对于数学定义,标示佩服,举一个例子,就四位二进制数来说,从-8到7,都可以用最高位作为负权位来表示,也就是说在-8到7之间整数与此公式标示的二进制数是一一对应且唯一的.在此表示对数学的钦佩,想说明一个法则具有普遍的适应性,数学似乎是唯一的方式.
疑惑来了:
既然这个公式和上面的那句话都可以得出负数补码,那么二者究竟是怎么贯通在一起的呢?理解了这个问题就打通了感性与理性,心中对补码的疑惑也就不存在了,学知识还是尽量到达这个程度比较好.
分析:
通俗(感性认知)理解补码:例如,-1的补码怎么样才能在算数的时候产生他的意义呢,-1+1必须等于0,那么-1的补码才有意义,或者说得到补码之后,-1+1的结果不能改变,那么看看-1的补码1111,加上0001得到10000,只看四位,那么就是0了,显然如此的完美,当然用上面的公式做出普遍意义的证明是比较容易的,大家可以试试.
理性理解补码:
-1为例,先看按位取反加1的过程,1001,符号位不动,按位取反得到1110,加1,也就是1111,这是-1的补码,分步来看,其实,先不看符号位,按位取反也就是0110,这相当于0111-0001 然后加1,0111+0001=1000,所以也就是1000-0001 = 0111,再加上符号位的1就得到了1111这个补码,换句话说也就是-8+7 = -1,那么看看补码数学定义的公式,也就是负权位的1与0111之和.
所以按位取反加1这种方法就是这个公式的规律性用法,为什么这么说呢?这里的取值范围是-8到正7,那么以正8为"镜子",也就是1000,想求-1的补码,那么就1000-0001得到与1互补的正数,然后加上负权位,自然就得到了-1,进一步通俗的理解就是,按位取反就是+1就是为了拿1000这个镜子去映射出"能够和负权位相加得到 当前负数绝对值所对应负数的 正数,类似于互补角,或者说成:是为了得到此负数绝对值,在此区间的互补数",所以说按位取反+1这种方式就是在变相的用公式得出结果,本质还是公式的定义.个人觉得这个办法反而让人产生疑惑,因为没有给出原理,只是告诉了方法.
总结:
应该说理解了按位取反+1就是公式的方便记忆和使用,本质还是公式的唯一性且一一对应,那么也可以理解为啥正数的补码是其本身了,因为正数最高权位是0,根本没有变化,现在想想还是从数学的角度去认知类似事物比较好,没什么可模糊疑惑纠缠的.
说在后面的话:
关键的地方在于按位取反+1就是得到了,此负数绝对值,在此区间的互补数,然后加上负权位.