内存中均以二进制补码储存数据,正数原、反、补相同.......大家都知道,但不知道为什么(由来),没有故事线连接也不便于记忆。网上很多详细的版本,我来个简短的。
原码的弊端:运算负数结果跟正确的方向相反,需要用反码纠正
反码的弊端:负数运算时,如果跨0会导致结果有1的偏差
补码则是为了解决反码跨0的问题
首先为了区分正负数,在数值的最大位0或者1表示正负
先看看二进制正数运算
比如:2+1=3
二进制的相加过程是这样的:
0000 0010
+ 0000 0001
结果是: 1000 0011 = 3(没毛病)
再看看:2-1=1
0000 0010
- 0000 0001
结是: 1000 0001 = 1(没毛病)
以上完全没问题,可负数参与运算结果就会相反
-----------------------------再看看负数运算-------------------------------
比如:-2+1=-1
二进制的相加过程是这样的:
1000 0010
+ 0000 0001
结果是: 1000 0011 = -3(错)
再比如:-2-1=-3
二进制的相加过程是这样的:
1000 0010
- 0000 0001
结果是: 1000 0001 = -1(错)
看图!!!
看蓝色-2的二进制表示形式,-2+1=-1,应该是往上移一格到-1,-2-1=-3则往下移动一格到-3,可上面的负数运算结果是刚好相反颠倒了!!!!· 变成: -2+1=-3, -2-1=-1,因此反码的诞生可以解决结果颠倒的问题,原码先转成反码再相加结果就可以纠正了。自己算一下看我骗你没。
原码的弊端:运算负数结果跟正确的方向相反,需要用反码纠正!
那为什么还需要补码呢?
再看:-2+2=0,按照刚才上下挪的方法-2+2就往上挪2格,结果是-0,好像也没问题,可如果是-2+3呢?挪三格,还是0,结果是1才对呀!!!
因为多了一个-0,-0和+0都是0,需要跨2次0,导致结果相差1,召唤神龙给反码+1补上了这个误差还不就可以了?是的,完美666!
不跨0运算时反码+1=补码,补码运算出结果再减去1再取反得到结果,加了又减,不影响结果!
跨0时,神龙帮忙+1,帮我跳过一个0,也不影响结果!
不对呀???总感觉怪怪的,-2+2呢?-1+1呢?结果刚好是0呢??此时补码又减1取反????
看图!!
-1+1的二进制是这样的:1111 1111
+ 0000 0001
结果: 1 0000 0000 (8个0)一个字节8位,最高位的1被顶掉了,剩下8个0,此时的8个0摇身一变,变成正数的0,正数源反补相同,无需再减1取反!!!!
另:-0的源码是1000 0000,计算机会直接解析为-128,所以一个字节的取值范围是 -128~127。
第一篇博客,欢迎评论,蟹蟹哦!