为什么计算机要使用反码/补码

2023-11-01

一、为什么需要反码?

反码的作用就相当于数学中的负数。

对于小学生来说,会做的算术题是:5-3,但是不会做3-5。于是,我们上初中的时候,数学里就引进了一个新的概念:负数。引入负数之后,本来是减法的运算就可以变成加法来实现:

3-5=3+[-5]=[-2],中括号代表“负数”,“负数”就是我们人为给出的数学术语。

对于计算机来说,会做的算术题是:5+3,但是不会做3-5。于是,我们就在编码里引进了一个新的概念:反码。引入反码之后,本来是减法的运算就可以变成加法来实现:

3-5=3+[-5]=[-2],中括号代表“反码”,“反码”就是我们人为给出的计算机术语。

这里,你一定有一个疑问:为什么计算机只会做5+3,不会做3-5。这是因为在计算机的数字电路中只有加法器,没有所谓的“减法器”。不是说计算机厂商不会设计减法器,因为聪明的人既然发明了方法能够用加法来实现减法操作,那为什么还需要画蛇添足的弄一个减法器?

接着说:那么反码要怎么定义才能实现减法变加法的功能呢?聪明的人想的办法如下:

1.正数反码保持原码不变:3=[0_0000011]

2.负数除最高位(正负符号位)外,全部取反(0变1,1变0):-5=1_0000101取反=[1_1111010]

于是3+[-5]=[-2]的计算过程为:

[0_0000011]+[1_1111010]=[1_11111101]

这样,这种反码方法就成功实现了目标!至于为什么,我想只有数学家能给出解释了。

二、为什么需要补码?

都是因为“0”这个特殊数字的存在。

先问你一个问题:0是正数还是负数?你肯定会说:0既不是正数也不是负数,这是我们初中学到的数学知识。这个回答没有问题,所以以后每次碰到0,人们都不会把它当正数或负数。

那么计算机呢?计算机不同于人脑,计算机在碰到任何数字之前只根据最高位的符号位来判断正负性,“0”表示正数,“1”表示负数。

前面我们推论了为何要用反码,那么用8位二进制反码表示的正数范围: +0 —— +127;负数范围: -127 —— -0。但是,其中有两个特殊的编码会出现:

[0_0000000]=+0 (反码)

[1_1111111]=-0 (反码)

其实,+0和-0代表的都是0。这样一来,“0”这个数字在计算机中的编码就不是唯一的了。对于计算机来说,这是绝对不行的,因为任何数字都只能有1个编码。

于是,聪明的人就做了这样一个决定:把0当成正数,也即+0,这样0的编码就变成:0_0000000。那8位二进制表示的正数范围仍然是: +0 —— +127。

但是,对于负数就必须要做调整,也即-0必须要让位---1_1111111这个编码不能表示-0。我们可以把负数整体向后“挪动1位”:只要将8位二进制表示的负数范围从:-127 —— -0变成:-128 —— -1,就能成功解决问题。

那么怎么整体挪动1位呢?方法就是反码+1。{1_1111111}编码就不再表示-0,而变成了-1。顺着推,最小的编码{1_0000000}就是-128。

我们给这个反码+1又人为的取了一个新的名字,叫补码。于是乎,补码的定义如下:

1.正数补码保持原码不变:3={0_0000011}

2.负数先求反码,然后再加1:-5=[1_1111010]+1={1_1111011}

于是3+{-5}={-2}的计算过程为:

{0_0000011}+{1_1111011}={11111110}

至此,通过补码就成功解决了数字0在计算机中非唯一编码的问题,且也能实现减法变加法。

所以,在计算机的世界里,0是正数。这点和我们学的数学不一样。

{0_1111111}=+127 (补码)

{0_0000000}=+0 (补码)

{1_1111111}=-1 (补码)

{1_0000000}=-128 (补码)

转载https://zhuanlan.zhihu.com/p/105917577

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么计算机要使用反码/补码 的相关文章

  • 清理码头 - 删除“不必要”的东西

    我习惯用Jetty http jetty codehaus org jetty 作为我的网络容器 我对我做了什么安装步骤得到原始的焦油球并且清理一些目录和文件从中 我在这里想提出的是 您通常从 Jetty 中删除什么以在生产 登台环境中使用
  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • Java套接字:在连接被拒绝异常时重试的最佳方法?

    现在我正在这样做 while true try SocketAddress sockaddr new InetSocketAddress ivDestIP ivDestPort downloadSock new Socket downloa
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • 列表应该如何转换为具体的实现?

    假设我正在使用一个我不知道源代码的库 它有一个返回列表的方法 如下所示 public List
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • 如何通过 Inno Setup for NetBeans 使用自定义 .iss 文件

    我将 Inno Setup 5 与 NetBeans 8 一起使用 并且我已经能够创建一个安装程序来安装该应用程序C users username local appname 但是我希望将其安装在C Programfiles 我如何在 Ne
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • 解决错误javax.mail.AuthenticationFailedException

    我不熟悉java中发送邮件的这个功能 我在发送电子邮件重置密码时遇到错误 希望你能给我一个解决方案 下面是我的代码 public synchronized static boolean sendMailAdvance String emai
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • 哪个集合更适合存储多维数组中的数据?

    我有一个multi dimensional array of string 我愿意将其转换为某种集合类型 以便我可以根据自己的意愿添加 删除和插入元素 在数组中 我无法删除特定位置的元素 我需要这样的集合 我可以在其中删除特定位置的数据 也
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • 嵌入式 Jetty - 以编程方式添加基于表单的身份验证

    有没有一种方法可以按如下方式以编程方式添加基于表单的身份验证 我用的是我自己的LdapLoginModule 最初我使用基本身份验证并且工作正常 但现在我想在登录页面上进行更多控制 例如显示徽标等 有没有好的样品 我正在使用嵌入式 jett
  • 在哪里存储 Java 的 .properties 文件?

    The Java教程 http download oracle com javase tutorial essential environment properties htmlon using Properties 讨论如何使用 Prop

随机推荐

  • FFM

    FFM理论与实践 在CTR CVR预估任务中 FFM Field aware Factorization Machine 与FM模型表现非常亮眼 FFM可以看作是FM的升级版 由Yuchi Juan于2016年提出 这里简单一下FFM的原理
  • faster R-CNN之RPN

    目标检测算法依赖于region proposals算法来假设目标位置 随着SPP Net和fast R CNN的改进 region proposals已经成为目标检测算法的瓶颈 RPN网络主要解决region proposals算法的以下问
  • 【电气专业知识问答】问:保护及故障信息管理系统子站系统用户权限管理如何设定?

    电气专业知识问答 问 保护及故障信息管理系统子站系统用户权限管理如何设定 答 所有信息管理系统组网实行权限分级 对不同的用户设定不同的权限 用户权限管理依据调度管辖范围及用户特点决定 1 主站的系统管理员 有最高权限的用户 可检查子站系统的
  • Qt学习 QVariant类(转)

    Qt学习 QVariant类 转 QVariant类作为一个最为普遍的Qt数据类型的联合 因为c 禁止没有构造函数和析构函数的联合体 许多继承的Qt类不能够在联合体当中使用 联合体当中的变量共用一个存储区 没有了联合变量 我们在物体属性以及
  • 漫画:什么是 “千年虫” 问题?

    在20世纪末 人类社会曾经遭遇过一场空前的大危机 如果这场危机真的降临 甚至有可能终结整个人类文明 后来 在全世界精英们共同努力之下 这场危机终于得以化解 这场危机既不是地震 也不是海啸 更不是瘟疫大流行 而是电子计算机带来的 千年虫 问题
  • Java的方法equals重写

    java 的 equals 方法一般情况下需要重写 以保证能够比较两个实例对象是否一致 注意重写 equals 方法时还要重写 hashCode 方法 equals 方法的注意事项 1 方法 equals 应为继承自 Object 的方法
  • 华为OD机试 - 优雅子数组(Java)

    题目描述 如果一个数组中出现次数最多的元素出现大于等于K次 被称为 k 优雅数组 k也可以被称为优雅阈值 例如 数组1 2 3 1 2 3 1 它是一个3 优雅数组 因为元素1出现次数大于等于3次 数组 1 2 3 1 2 就不是一个3 优
  • 最大子阵列-计蒜客

    在一个数组中找出和最大的连续几个数 至少包含一个数 例如 数组A 2 1 3 4 1 2 1 5 4 则连续的子序列 4 1 2 1 有最大的和6 输入格式 第一行输入一个不超过1000的整数n 第二行输入n个整数A i 输出格式 第一行输
  • 统计学习之时间序列分析

    一 什么是时间序列 1 定义 按照时间的顺序把一个随机事件变化发展的过程记录下来 就构成了一个时间序列 对时间序列进行观察 研究 找寻它变化发展的规律 预 测它将来的走势就是时间序列分析 2 栗子 7000年前 古埃及人把尼罗河涨落的情况逐
  • (C++)类与对象——封装

    目录 封装的基础与意义 1 类的创建与调用 类的案例 学生类的创建 封装的意义 封装是C 中面向对象的三大特性之一 1 属性与行为 2 权限 class和struct的区别 struct创建时 结构体内的成员默认属性都是 public cl
  • 获取鼠标位置插入字符串

    str 指的是插入的字符串 id为textarea function setStr str id var tc id var tclen tc val length tc focus if typeof document selection
  • ubuntu 20.04 设置不见了

    ubuntu20 04 用着用着突然发现设置不见了 即使重启电脑还是找不到设置 后来通过扒帖子发现是一个包丢失了 gnome control center 重新安装一个这个包就好了 sudo apt install gnome contro
  • echarts各种调整样式(史上最全)

    Echars各种样式调整 史上最全 全图默认背景 backgroundColor rgba 0 0 0 0 默认色板 color ff7f50 87cefa da70d6 32cd32 6495ed ff69b4 ba55d3 cd5c5c
  • php发送邮件验证码,PHP(ThinkPHP5.0) + PHPMailer 进行邮箱发送验证码

    GitHub下载最新版第三方类库PHPMailer 第一步 打开网址https github com PHPMailer PHPMailer 下载PHPMailer PHPMailer 需要 PHP 的 sockets 扩展支持 而登录 Q
  • 动手深度学习:计算机视觉——语义分割

    目录 图像分割和实例分割 Pascal VOC2012 语义分割数据集 预处理数据 自定义语义分割数据集类 读取数据集 整合所有组件 转置卷积 填充 步幅和多通道 与矩阵变换的联系 使用矩阵乘法来实现卷积 使用矩阵乘法来实现转置卷积 使用全
  • 使用MATLAB绘制二元函数图像

    使用matlab绘制一个二元函数的图像 首先得告诉计算机 函数的定义域和值域 以及绘制精度 点数 然后使用meshgrid 函数划分网格 然后计算机根据你给定的函数 如Z f x y 计算每个点的取值 然后利用绘图函数 如surf 或mes
  • 在线生成免费android ios图标

    记录一个比较好用的网址 可以用来一键生成android iOS图标 且iOS图标百分百匹配 一 先上链接 https icon wuruihong com 二 点击上传 选择平台android ios 三 点击开始生成 预览 四 下载所需图
  • 提权_【CVE-2017-16995】 Linux 内核漏洞提权

    1 信息收集 上传信息收集脚本 运行并查看是否有 CVE 2017 16995 漏洞 这里我用到的信息收集脚本为 linux exploit suggester 2 pl perl linux exploit suggester 2 pl
  • R语言数据分析报告 鲍鱼年龄预测

    鲍鱼年龄预测 一 背景与目标 鲍鱼的生长在贝类家族中属于比较慢的种类 从受精卵开始 长到商品规格6 8厘米 通常需要1 4年甚至更长时间 以我国的皱纹鲍为例 大约需要近3年的生长才能达到7厘米左右 鲍鱼的生长速度随年龄的增长呈下降趋势 鲍鱼
  • 为什么计算机要使用反码/补码

    一 为什么需要反码 反码的作用就相当于数学中的负数 对于小学生来说 会做的算术题是 5 3 但是不会做3 5 于是 我们上初中的时候 数学里就引进了一个新的概念 负数 引入负数之后 本来是减法的运算就可以变成加法来实现 3 5 3 5 2