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

    在计算机硬件中,数字都以无符号的二进制形式表示,因此需要一种编码负号的方法。当前有四种方法,用于扩展二进制数字系统,来表示有符号数:原码(sign-and-magnitude),反码(ones' complement),补码(two's complement)。原码、反码、补码都有符号位,符号位为1表示负数,0表示正数。

    原码

    为了解决表示一个数字的符号的问题,首先的处理办法应该是分配一个符号位来表示这个符号:设置这个位(通常为最高有效位)为0表示一个正数,为1表示一个负数。数字中的其它位指示数值(或者绝对值)。因此一个字节只有7位(除去符号位),数值的范围从0000000(0)到1111111(127)。这样当你增加一个符号位(第八位)后,可以表示从−127到+127的数字。这种表示法导致的结果就是可以有两种方式表示0,00000000(0)与1,0000000(−0)。

    反码

    一种叫做反码的系统也可以用于表示负数(注:正数与原码形式一样,无需取反)。一个负二进制数的反码形式为在原数基础上按位取反,即对应正数的补。同原码表示一样,0的反码表示形式也有两种:00000000(+0)与11111111(−0)。传统的表示为−127到+127,以及00000000(+0)或者11111111(−0)。

    注意负数的反码只需按位求数值的补就可以得到,符号不需要变动。

    补码

    补码回避了0有多种表示的问题以及循环进位的需要。在补码表示中,负数以位模式表示为正值的反码加1(当作无符号数)。

    在补码表示中,只有一个0(00000000)。求一个数的否(无论是负数还是正数)需要反转所有位,然后加1。一对补码整数相加等价于一对无符号数相加

    127:01111111
    −128:10000000
    -127:10000001
    -1:11111111

    得到一个数字补码的简单方法表示如下:

    1. 从右边开始,找到第一个'1'
    2. 反转从这个'1'之后开始到最左边的所有位
    无符号数0101100->补码1010100

    摘自wiki:http://zh.wikipedia.org/wiki/%E6%9C%89%E7%AC%A6%E8%99%9F%E6%95%B8%E8%99%95%E7%90%86

  • 相关阅读:
    Linux中常用操作命令(转)
    EntityFramework 优化建议(转)
    android 腾讯x5内核 浏览器
    Android MediaMetadataRetriever 读取多媒体文件信息,元数据(MetaData)
    Android MVP 利用rxjava 避免向Model传入监听方法
    Android 单元测试(junit、mockito、robolectric)
    Android 利用RecyclerView.Adapter刷新列表中的单个view问题
    android 5.0以上通知栏、状态栏图标变成白色
    Android 照相 滤镜
    Android 进程常驻(使用第三方MarsDaemon)(虽然不可用,但是还是保留下。)
  • 原文地址:https://www.cnblogs.com/linyx/p/3775421.html
Copyright © 2011-2022 走看看