zoukankan      html  css  js  c++  java
  • 计组之原码、反码、补码

       数值在计算机中是以补码的方式存储的。

       一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1。比如,十进制中的数 +2 ,计算机字长为8位,转换成二进制就是[00000010]。如果是 -2 ,就是 [10000010] 。因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数[10000010],其最高位1代表负,其真正数值是 -2 而不是形式值130。所以将带符号位的机器数对应的真正数值称为机器数的真值

      原码:在数值前直接加一符号位的表示法。eg:符号位 数值位

          无符号位:0~255  有符号位:-127~ +127

          byte(字节,一字节=8比特位)的取值范围是-27+1~ 27-1 总计255个数

      反码:正数的反码是其本身;

         负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。符号位为“1”,数值部分按位取反。

         8位二进制反码的表示范围:-127~+127。

         eg: [+7]反= 0 0000111 B  [-7]反= 1 1111000 B

          注意:1000 0000 B 不等于0 而是 -128,+127 +1 = -128即 0111 1111 B+1 = 1000 0000 B ,也就是发生了 byte值溢出。

          1000 0000 (原) = 1111 1111(反)
          那么问题来了: 64+32+16+8+4+2+1 = 127 为什么会有128呢?
          原来 负数的反码是需要补码来计算的,也就是在最后得出的结果上 +1  
          注意:计算机中只有 +0 而不存在 -0的说法,因为-0是完全没有意义的存在,即:只有 0000 0000 = +0,而没有 1000 0000 = -0
          1000 0000的真实身份是 -128
      补码:正数:正数的补码和原码相同。

          负数:负数的补码则是符号位为“1”。并且,这个“1”既是符号位,也是数值位。数值部分按位取反后再在末位(最低位)加1。也就是“反码+1”。

          [+7]补= 0 000 0111 B  

          [-7]补 = 1 111  1001 B

      计算机为什么要使用补码?

      一:根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1+(-1), 所以计算机被设计成只有加法而没有减法, 而让计算机辨别”符号位”会让计算机的基础电路设计变得十分复杂,于是就让符号位也参与运算,从而产生了反码。

      用反码计算, 出现了”0”这个特殊的数值, 0带符号是没有任何意义的。 而且会有[0000 0000]和[1000 0000]两个编码表示0。

      于是设计了补码, 负数的补码就是反码+1,正数的补码就是正数本身,从而解决了0的符号以及两个编码的问题: 用[0000 0000]表示0,用[1000 0000]表示-128。
       注意-128实际上是使用以前的-0的补码来表示的, 所以-128并没有原码和反码。使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数。 这就是为什么8位二进制, 使用补码表示的范围为[-128, 127]。

      二:看有符号的。

      若是用原码表示,0表示为0000 000。因为咱们有符号,所以应该也有个负0(虽然它还是0):1000 0000。
      那么原码能够满足我们的要求,把单字节表示256个数据么?
      正数,没问题,127是0111 1111,1是0000 0001,当然其它的应该也没有问题。
      负数呢,-1是1000 0001,那么把负号去掉,最大的数是111 1111,也就是127,所以负数中最小能表示的数据是-127。
      这样似乎不太对劲,该如何去表示-128?貌似直接用原码无法表示,而我们却有两个0。


      如果我们把其中的一个0指定为-128,不行么?这也是一个想法,不过有两个问题:一是它与-127的跨度过大;二是在用硬件进行运算时不方便
      所以,计算机中,负数是采用补码表示。
      eg:  单字节-1,原码为1000 0001,反码为1111 1110,补码为1111 1111,计算机中的单字节-1就表示为1111 1111。
        单字节-127,原码是1111 1111,反码1000 0000,补码是1000 0001,计算机中单字节-127表示为1000 0001。
             单字节-128,原码貌似表示不出来,除了符号位,最大的数只能是127了,其在计算机中的表示为1000 0000。

  • 相关阅读:
    UVA 11374 Airport Express (最短路)
    UVA Live 3713 Astronauts (2-SAT)
    UVALive 3211 Now or Later (2-SAT)
    UVA 11324 The Largest Clique (强连通分量,dp)
    UVALive 4287 Proving Equivalence (强连通分量)
    UVA1665 Islands (并查集)
    UVA 1664 Conquer a New Region (Kruskal,贪心)
    UVA
    Gym 100342F Move to Front (树状数组动态维护和查询)
    Gym 100342E Minima (暴力,单调队列)
  • 原文地址:https://www.cnblogs.com/dork/p/13603245.html
Copyright © 2011-2022 走看看