原码,反码,补码,移码都是些啥?

本贴最后更新于 3335 天前,其中的信息可能已经时移世异

       1010

       为了方便地使用计算机进行存储和计算,我们引入了原码、反码、补码和移码。直接用正号“+”和负号“-”来表示符号的二进制数,叫做符号数的真值。把一个数连同其符号在内在机器中的表述加以数值化,这样的数称为机器数。一般用最高有效位来表示数的符号,正数用0表示,负数用1表示。例如,真值+1001,对应的机器数为01001;真值-1001,对应的机器数为11001。一个浮点数包括尾数,阶码和符号位。

  • 原码

       原码,即符号位加上二进制数的绝对值,第1位表示符号位,对于正数,符号位记为0,对于负数,符号位记为1,其余各位表示数值部分。例如,真值+1001,对应的原码为01001;真值-1001,对应的原码为11001。

       对于n位整数,其原码表示的数的范围为:-(2^(n-1)-1)~(2^(n-1)-1)。若某个整数用8位二进制表示,则它的范围为11111111~10000000~00000000~01111111,即-127~-0~+0~+127。在加减运算中,减法可以看成加法,减去一个数相当于加上这个数的相反数,但使用原码会出现问题。例如,用8位二进制的原码表示,

       2 - 3 = 2 + (-3) = 00000010 + 10000011 = 100000101 = -5。

       2 - 2 = 2 + (-2) = 00000010 + 10000010 = 10000100 = -4。

 因此,我们需要继续研究,接下来介绍反码。

  • 反码

       用反码表示时,左边第一位也是符号位,符号位为0代表整数,符号位为1代表负数,对于负数,反码的数值是将其原码数值按位求反而得到的,而对于正数其反码和原码相同。例如,真值+1001,对应的反码为01001;真值-1001,对应的反码为10110。

       对于n位整数,其反码表示的数的范围与原码一样,为:-(2^(n-1)-1)~(2^(n-1)-1)。若某个整数用8位二进制表示,则它的范围为10000000~11111111~00000000~01111111,即-127~-0~+0~+127。

       对于上面的问题,用8位二进制的反码表示,

       2 - 3 = 2 + (-3) = 00000010 + 11111100 = 11111110 = -1。

       2 - 2 = 2 + (-2) = 00000010 + 11111101 = 11111111 = -0。

可以看到,我们离目标更进一步了。继续分析,由于反码中有两种形式的0,+0即00...0,-0即11...1。而数学中+0和-0是不加以区分的,只有一个0。所以问题出在-0上,我们想办法把它去掉。负数的范围是-127~-0,如果把它改成-128~-1,那问题不就解决了吗?因此我们引入补码。

  • 补码

      在补码表示法中,正数的补码表示同原码和反码的表示是相同的,而负数的补码表示却不同。对于负数的补码,其符号位为1,而数值部分是将其原码数值部分“按位求反,末位加1”而得到的。例如,真值+1001,对应的补码为01001;真值-1001,对应的补码为10111。对于n位整数,其补码表示的数的范围为:-2^(n-1)~(2^(n-1)-1)。若某个整数用8位二进制表示,则它的范围为10000000~01111111,即-128~+127。

      对于上面的问题,用8位二进制的补码表示,2 - 3 = 2 + (-3) = 00000010 + 11111101 = 11111111 = -1。2 - 2 = 2 + (-2) = 00000010 + 11111110 = 00000000 = 0。解决问题。

  • 移码

       对于浮点数,补码可以解决尾数的表示,但把补码用于表示阶码,则有些不妥。因为补码有正负号,不便于比较两个指数的大小和进行对阶操作。对于8位二进制的补码,它的范围是-128~+127。如果我们加上128,则它的范围变为0~255。这样我们就可以方便的比较两个指数的大小和进行对阶操作了。例如,-127的补码是10000001,加上128变成00000001,而0的补码是00000000,加上128变成10000000。加上128后可以明显地看出0大于-127。因此我们引入移码。

       移码通常用于表示浮点数的阶码。阶码是个k位的整数,最高位为符号位。移码的一般定义是:[e]移 = 2^k + e,其中[e]移为机器数,2^k是一个固定的偏移值常数,e是真值且其范围为-2^k <= e < 2^k。例如,k = 4,真值+1001,对应的移码为1,1001;真值-1001,对应的移码为0,0111。

       在IEEE 32位浮点格式中,阶码字段k = 8位,固定的偏移值常数不是2^k,而是2^(k-1) - 1 = 2^7 - 1 = 127。这样,指数真值e的范围为-127~+128,阶码E的范围为0~255。由于要除去E用全0和全1表示零和无穷大的特殊情况,E的范围变为1~254,真正的指数值e的范围变为-126~+127。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 215 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    693 引用 • 537 回帖
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • gRpc
    11 引用 • 9 回帖 • 89 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2040 回帖
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 176 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    9438 引用 • 42980 回帖 • 108 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    171 引用 • 3842 回帖
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    498 引用 • 1395 回帖 • 254 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    28 引用 • 197 回帖 • 26 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    345 引用 • 742 回帖
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    183 引用 • 1011 回帖 • 2 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 3 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    586 引用 • 3538 回帖
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 116 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 1 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖 • 1 关注
  • Outlook
    1 引用 • 5 回帖 • 2 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    36 引用 • 155 回帖 • 2 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 2 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 205 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 566 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 638 关注