• 理解二进制的原码、反码、补码


    2019-10-03 13:21:54 magic_1024 阅读数 39更多

    一、什么是二进制

      在说二进制之前,我们先回想下平常我们用的最多的十进制,1,0,50,-100,899等等这些数字我们在熟悉不过了,牵扯到我们的衣食住行方方面面。组成十进制的数字符号集合为{0,1,2,3,4,5,6,7,8,9}共十个元素。十进制的运算规则为:
     1.“满十进一,借一当十”
     2.按位权展开,第一位权为10^0, 第二位位权为10^1 ……以此类推,第N位10^(N-1),这也就是我们说的位置化数字系统,在数字中符号所占据的位置决定了其表示的值
     例如,十进制数字698在位置化系统中含义:
    698

      这里我们看到,位权中的基数跟进制的符合集合个数有关,十进制有0~9共十个符号,所以十进制的位权基数为10,基数的幂从0开始到n-1。
      有了十进制的铺垫,那么二进制理解起来就不会那么难了。二进制是计算机存储程序和数据的标准形式,二进制的符号集为{0,1},所以二进制只能以0、1的组合去表示数字,类比十进制规则,它的规则则是:
      1.满二进一,借一当二
      2.按位权展开,基数为2,第一位权为2^0, 第二位置位权为2^1 ……以此类推,第N位2^(N-1),同样遵循位置化数字系统规则
     例如,数字6的二进制表示为110:
    6

      十进制如何转换二进制呢?
      十进制转换为二进制很简单,使用十进制数除以2取余数,直到商为0,所得的余数倒序排列。
      例如我们将十进制的数字8转换为二进制表示的运算过程:
    8

    二、原码

       存储到计算机之中的数据都被转换为了二进制形式,但是还有问题需要解决:如何存储数字的符号?
       如果不考虑数字的符号,对于n位存储单元,所能存储的范围为[0~2^n-1],例如n=4时,它能表示的范围就是0 ~ 15。
       但我们都知道,数字有正数、负数之分,因此原码表示法规定了,在n位的存储单元中,使用最左1个二进制位表示符号0表示正1表示负其余位置表示数字的绝对值
       例如n=4的存储单元,所能存储的无符号数范围为[0~2^n-1],最左位当做符号位置后,可以仅用剩余3位表示数字的绝对值。
    原码表示   从上图我们可以看到n=4位的存储单元,使用原码表示法时,被分为了两个相等的子范围即是正整数0000 ~ 0111和负整数1000 ~ 1111。
       所以总结起来原码表示法,n位的存储单元可存储数字范围为-(2^n-1 - 1)至 +(2^n-1 - 1),并且原码表示法中有两个0+0 和 -0

    三、反码

       原码在计算机存储整数中并不常用,计算机使用二进制补码来表示n位存储单元中的有符号整数
    反码是由原码转换为补码的中间形式,该运算可以应用到任何整数,无论是正的还是是负的,进行反码运算时,最左边符号位保持不变,当此数字为负数时,其绝对值位各位求反;正数反码为这个数本身
       例如n=4位存储单位中数字3的反码:
    3的反码
       -3的反码:
    -3

    四、补码

       几乎所有计算机都使用使用二进制补码来表示n位存储单元中的有符号整数。那么如何获得一个数补码,规则很简单:
       正数的补码为其本身
       负数的补码为其反码在加上1得到的结果

     例如在4位的存储单位中,-5的补码表示:
    在这里插入图片描述

    例如在n=4位的存储单元中,还原1 0 1 1所表示的整数:
    在这里插入图片描述

     所以总结起来,计算机以二进制补码存储正数遵循以下步骤:
      ①将整数转换为n位的二进数
      ②如果整数是正数或零,以其原样存储,如果是负数,计算机取其补码。
     而从二进制补码还原为整数,遵循如下步骤:
       ①如果最左位是1,计算机取其补码。如果是0,不进行任何操作
       ②将该整数转换为十进制

    四、为什么使用补码

       计算机采用二进制补码表示的优点在于加法和减法之间没有区别,当遇到减法运算时,计算机可以简单的把它转变为加法,只需要求为第二个数求二进制的补码即可这样符号位就能参与运算,降低了计算机逻辑电路复杂度
      例如在n=4位存储单元,计算机计算5-3时,可以按照5+(-3)处理
    补码计算
    得到结果0010按照补码->十进制整数转换规则,结果是2
      补充:二进制补码加法与十进制加法一样,列与列相加,满二进一,如果有进位,就加到下一列,但是最后一列进位要舍弃(如图中的红色标识的1)。

  • 相关阅读:
    Perl的运算符号字符
    windows xp 使用远程桌面时的关机/重新启动方法
    抵御TCP的洪水
    远程桌面连接中的常见问题 连接上就断开
    批量kill mysql进程
    Linux如何查看硬盘型号和缓存
    Apache Rewrite 规则详解
    nginx 内置变量大全
    大数据量分页存储过程效率测试附代码
    ASP.Net 更新页面输出缓存的几种方法(包括用户控件,iframe,页面缓存等)
  • 原文地址:https://www.cnblogs.com/grj001/p/12223537.html
Copyright © 2020-2023  润新知