个人认为关于“补码”的完美解释
2015-04-11 18:31
204 查看
首先要说明一点,这种解释补码的方法也是我自己刚学来的,以前从来不知道可以这样理解,我本人也开始学习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型的补码圆中即可。不知道这样讲对于大家理解补码是不是容易点了呢?希望有点帮助。
相关文章推荐
- 关于Linux中两种引号的问题,个人认为并不该说3种。
- 关于一个选举的票数统计程序,每一位候选人的记录内容均为字符0或1,1表示此人被选中,0表示此人未被选中,若一张选票选中人数大于5个人时被认为无效的选票。
- 控件重叠 关于WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解(个人认为还是相当全面的)
- 理解矩阵(个人认为这是关于矩阵最精彩的理解,推荐~~)
- 关于傅里叶变换的解释,转载一个我认为最经典的
- 关于jQuery插件jTip的修改,代码基本上没变,只进行了简单的修改,我个人认为这样更合适!
- 关于WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解(个人认为还是相当全面的)
- 关于WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解(个人认为还是相当全面的)
- 关于算法中“RSA”,“数字签名”等名词的解释和个人理解
- 关于iOS多线程,我说,你听,没准你就懂了!(看过的文章中个人认为最通俗易懂的)
- C语言关于补码的解释及误区
- C语言关于补码的解释及误区
- (转载)关于WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解(个人认为还是相当全面的)
- C语言关于补码的解释及误区
- 关于计算机中补码的个人理解
- 个人认为最完美的css处理div圆角的方法
- 关于CSS浮动与绝对定位的个人感悟,看完这篇文章能得到很多相关问题的解释
- C语言关于补码的解释及误区
- 关于补码的解释
- 理解矩阵(个人认为这是关于矩阵最精彩的理解,推荐~~)