个人认为关于“补码”的完美解释

首先要说明一点,这种解释补码的方法也是我自己刚学来的,以前从来不知道可以这样理解,我本人也开始学习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型的补码圆中即可。不知道这样讲对于大家理解补码是不是容易点了呢?希望有点帮助。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值