原码、反码、补码的由来,我来个简短的方便记忆!

内存中均以二进制补码储存数据,正数原、反、补相同.......大家都知道,但不知道为什么(由来),没有故事线连接也不便于记忆。网上很多详细的版本,我来个简短的。

原码的弊端:运算负数结果跟正确的方向相反,需要用反码纠正

反码的弊端:负数运算时,如果跨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。

                                        

第一篇博客,欢迎评论,蟹蟹哦!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值