首先要说明一点,这种解释补码的方法也是我自己刚学来的,以前从来不知道可以这样理解,我本人也开始学习java没多久,希望可以帮到更多的同行者。 当初自学到二进制的地方的时候,其他的都还ok,就是关于补码的解释一直搞的自己云里雾里的,只知道什么按位取反,再加1减1什么的,然后还一直搞不 懂为什么-1是32个1那么大,而且按照它们的规则,自己怎么验算都感觉不对。为此自己也找了好多的资料,但是差不多都是相同的说法。没办法只能记住死 方法了,直到今天我听到了一个非常美妙的解释,就在我看到那个图的 一瞬间,一直以来的所有的疑惑都迎刃而解。附图如下:图中是以4个bit位为例来说明一组补码的 从0到15.这里要说明一下补码就是为了表示负数的,计算机中表示负数,其实质的底层就是正数,只是人为的做了一下规定,最高位1表示负数。那么只需 要对该图稍微的做点变换就可以做看出补码的奥秘。
以红线为分界线,只要在-8~~~7的范围内的运算都可以准确的进行表示。同时也可以看到0对应的 另一端就是这个补码范围内最小的数,而-1对应的另一端就是该补码范围内最大的数,同时最大的数加1就是最小的数,而最小的数减1就是最大的数。 是不是感觉很神奇?依同样的道理进行推广,可以想像byte型数据的补码是以8个bit的大一点的圆圈,short是16个bit的圆,而我们经常使用的int 就是32个bit的更大的圆。也同样可以理解,int范围内的补码中,最大的和最小的同样是相邻的,-1的对面是最大的,0的对面是最小的。这点在java中 很容易得到验证。int型的补码一圈是2的32次方个数所以半圈是2的31次方。即int a=-1+1024*1024*1024*2;int b=Integer.MAX_VLUE;此时a等于b,同时 b+1应该和Integer.MIN_VLUE的值相等。验算后可以确定数据的正确性。计算机中补码就是这样存在的。而我们说过的int型数据溢出就是超出了图中的右半部 分。这是只要定义在long型的补码圆中即可。不知道这样讲对于大家理解补码是不是容易点了呢?希望有点帮助。
个人认为关于“补码”的完美解释
最新推荐文章于 2022-12-17 22:54:22 发布