zoukankan      html  css  js  c++  java
  • 原码、反码、补码什么意思?有什么用?

    原码、反码、补码什么意思?有什么用?

      假设有一 int 类型的数,值为5,那么,我们知道它在计算机中表示为:  00000000 00000000 00000000 00000101  5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。  现在想知道 ...
      假设有一 int 类型的数,值为5,那么,我们知道它在计算机中表示为:
      00000000 00000000 00000000 00000101
      5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。
      现在想知道,-5在计算机中如何表示?
      在计算机中,负数以其正值的补码形式表达。
      什么叫补码呢?这得从原码,反码说起。
      
      原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
      比如 00000000 00000000 00000000 00000101 是 5的 原码。
      反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
      取反操作指:原为1,得0;原为0,得 1。(1变0; 0变1)
      比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。
      称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。
      反码是相互的,所以也可称:
       11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互为反码。
      补码:反码加1称为补码。
      也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
      比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。
      那么,补码为:
      11111111 11111111 11111111 11111010 1 = 11111111 11111111 11111111 11111011
      所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。
      
      再举一例,我们来看整数-1在计算机中如何表示。
      假设这也是一个int类型,那么:
      1、先取1的原码:00000000 00000000 00000000 00000001
      2、得反码: 11111111 11111111 11111111 11111110
      3、得补码: 11111111 11111111 11111111 11111111
      
      正数的原码,补码,反码都相同,都等于它本身
      负数的补码是:符号位为1,其余各位求反,末位加1
      反码是:符号位为1,其余各位求反,但末位不加1
      也就是说,反码末位加上1 就是补码
      
      1100110011 原
      1011001100 反 除符号位,按位取反
      1011001101 补 除符号位,按位取反再加1
      
      正数的原反补是一样的
      在计算机中,数据是以补码的形式存储的:
      在n位的机器数中,最高位为符号位,该位为零表示为正,为1表示为负;
      其余n-1位为数值位,各位的值可为0或1。
      
      当真值为正时:原码、反码、补码数值位完全相同;
      当真值为负时: 原码的数值位保持原样,
      反码的数值位是原码数值位的各位取反,
      补码则是反码的最低位加一。
      注意符号位不变。
      如:若机器数是16位:
      十进制数 17 的原码、反码与补码均为: 0000000000010001
      十进制数-17 的原码、反码与补码分别为:1000000000010001、1111111111101110、1111111111101111
  • 相关阅读:
    关于 锁的四种状态与锁升级过程 图文详解
    悲观锁与乐观锁的实现(详情图解)
    面试三轮我倒在了一道sql题上——sql性能优化
    我的程序跑了60多小时,就是为了让你看一眼JDK的BUG导致的内存泄漏。
    快来!我从源码中学习到了一招Dubbo的骚操作!
    我从LongAdder中窥探到了高并发的秘籍,上面只写了两个字...
    震惊!ConcurrentHashMap里面也有死循环,作者留下的“彩蛋”了解一下?
    mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比,于是写了个插件。
    吐血输出:2万字长文带你细细盘点五种负载均衡策略。
    mybatis开发,你用 xml 还是注解?我 pick ...
  • 原文地址:https://www.cnblogs.com/mikechang/p/1707785.html
Copyright © 2011-2022 走看看