当前位置: 首页 > news >正文

深入理解计算机中的补码、反码、原码

问题:

  • 我们每天用的钟表,其实只有1~12这12个数字,但我们日常会说13点、17点之类的。
    问:13点在钟表上哪个位置?
    答:很简单嘛,1点的位置。
    你不觉得奇怪吗,为啥13点会和1点在同一个位置?换言之,13和1有啥关系,17和5有啥关系?
  • 计算机里为啥要用加法替代减法?
    • 当然是加法电路设计比减法电路设计简单了,加法电路详见CPU之图解算数逻辑单元ALU
  • 怎么用加法替代减法?

一、基本概念

1.0、余数(remainder)

在算术中,当两个整数相除的结果不能以整数商表示时,余数便是其“余留下的量”。当余数为零时,被称为整除。
即:被除数 / 除数 = 商……余数,用数学表示:
a = qd + r, 0 <= r < d,其中a为被除数,q为商(quotient),d为除数(divisor),r为余数(remainder)。
举例:当除数为4时,任何正数除以4时,余数总在0, 1, 2, 3中;

0 / 4 = 0 …… 0
1 / 4 = 0 …… 1
2 / 4 = 0 …… 2
3 / 4 = 1 …… 3
4 / 4 = 1 …… 0
5 / 4 = 1 …… 1
6 / 4 = 1 …… 2
7 / 4 = 1 …… 3
8 / 4 = 2 …… 0
……

如上,被除数从0开始递增时,余数会在0, 1, 2, 3中一直循环下去,这就是同余
在这里插入图片描述
现在我们考虑除数为10时,则余数在0~9这10个数字中出现;把这10个数字同样置于圆盘中,如上图所示。
0-9这10个数字的圆盘中,再也不会有其它数字了,也就是我们限定了我们的数字范围为0~9数字个数(记为模)10
给定圆盘上任一个数字作为
起始点(记为 src)
,任一个数字为 终止点(记为dest),我们考虑从src出发,如何到达dest,可以 前进(记为 + ),可以后退(记为 - )
举例

src = 3,dest = 4;

  • 前进1步(+1),即 3 + 1 = 4;
  • 后退9步(-9), 即 3 - 9 = 4;

src = 3,dest = 3;

  • 前进0步(+0),即 3 + 0 = 3;
  • 后退(9+1)步(-(9+1)), 即 3 - ( 9 + 1) = 4;// 因为我们限定了数字范围为0~9,所以写成(9 + 1)

src = 5,dest = 9;

  • 前进4步(+4),即 5 + 4 = 9;
  • 后退6步(-6), 即 5 - 6 = 9;

通过上面的例子,发现了吗?

  • 对于确定的起止点(如src = 3,dest = 4),不管前进或者后退,我们都可以到达,也就是说前进(1步)等价于后退(9步),
  • 前进步数和后退步数之和为模(10),模意味着啥?
  • 模意味着走了一圈,一个轮回,起点走一圈,又回到了起点

1.1、补数(complement)

定义:对于给定的进位制,相加后能使自然数 a 的位数增加 1 的最小的数。
说人话:就是前面前进和后退的步数等价的组合(如1和9、2和8、3和7、4和6),也即可以组成模(如10)的组合。
即:

当 a = 1时,a只有1位数字(即个位)要想将a变成2(1+1)位数字10(十位、个位),需要增加9。
所以 9是1的补数;当然1也是9的补数,即1、9互为补数;
同理:2、8互为补数;
3、7互为补数;
4、6互为补数;

问: 36的补数是多少?
答:64

根据上面定义,我们知道对于整数a,a的补数 = 模 - a(a>=0);
补数有啥用?
还是回到之前我们0~910个数字的圆盘上来,我们来算小学生都会的10以内的加减法:
在这里插入图片描述
在这里插入图片描述
一顿操作猛如虎,一看结果:直呼OMG,
在这里插入图片描述
正如上图所示:减掉一个数,等价于加上这个数的补数
这里有个重要的前提:数字是有范围的(上面我们限定了0~9这10个数字)

1.2、减法

根据我们上面的结论:当数字是有范围的,则对于这个范围内的数字,减掉一个数,等价于加上这个数的补数,我们可以用加法替代减法,进一步:减去一个正数相当于加上这个正数对应的负数。
还是回到我们前面提到的圆盘上来,我们把这条结论实践下:

  • 我们先在坐标轴上标出0~9这10个数字范围,然后移动这个范围框,使框内正负数个数大致相等,如下图所示,数字范围变成了-5 ~ 4这10个数字。
    在这里插入图片描述
  • 将坐标轴上的数字范围同步映射到圆盘上。
    在这里插入图片描述
  • 此时,圆盘上数字的运算可以用圆盘外相对应的数字进行替代,即圆盘上的数字范围已经改变了,由之前的0 ~ 9 变成了现在的 -5 ~ 4
    在这里插入图片描述

1.3、补码

看到这里,不知道你是否认可前面的推导结论?
不认可?不认可就对了。聪明的你一定发现了上面的计算的问题:
1 - 5 = -4,在我们映射后变成了 1 + 5 = 6-4 不等于 6?虽然圆盘上6确实对应**-4**,但我们需要的是正确的结果-4,怎么将6转换成-4?
在这里插入图片描述

  • 好了,为了后面好叙述,我们先给实际求值结果记为原码,映射后的结果记为补码。我们先分析下实际的求值结果和映射后的结果:
    • 发现原码为0和正数时,补码正确,即原码为0和正数时,原码等于补码
    • 原码为负数时,补码错误,即原码为负数时,原码不等于补码。
      在这里插入图片描述

问题来了?原码为负数时,补码(如6)怎么转换成原码(如-4)?
答: 谜底就在谜面上,你直接看圆盘不就好了,圆盘上都标注了,圆盘内外侧的数字就是我们原码和补码的映射表。
问题又来了?圆盘上的映射怎么来的?
答:通过补数变换得到的,即原码为负数时,补码 + |原码| = 模,也即原码为负数时,补数 + |原码| = 模,在1.1小节中,我们提到了 a的补数 = 模 - a(a>=0);

综上:原码为负数时,补码 + |原码| = 模

二、 二进制里的花花世界

宏观世界搞定了,看看微观世界,十进制搞完了,看看二进制。
二进制我们以1Byte(8bit)研究,1 Byte 可以表示256个数(28),即模为256

2.1 原码

1 Byte 范围的内数字为0~255这256个数字。将其置于圆盘上如下:
在这里插入图片描述

2.2 补码

  • 调整数字范围使其映射到 -128~127256个数字:
    在这里插入图片描述
  • 调整圆盘范围,即原码写到圆盘上,补码写到圆盘外,如下:
    在这里插入图片描述

2.3 补码和原码转换

原码和补码怎么转换呢?
通过1.3节,我们知道如下结论:

  • 原码为0和正数时,原码等于补码
  • 原码为负数时,补码 + |原码| = 模
    在这里插入图片描述
  • 还记得我们在1.3 小节 文末得到的结论吗?原码为负数时,补码 + |原码| = 模,我们变换下这个等式,即原码为负数时,补码 = 模 - |原码|,按照公式我们计算下:
    在这里插入图片描述
    至此,二进制的原码和补码转换我们也已搞定,即:
  • 原码为0和正数时,原码等于补码
  • 原码为负数时,补码 = 模 - |原码|

2.4 反码

不知道你绕晕了吗?还记得我们的初心吗?怎么用加法替代减法?
2.3 节说原码为负数时,补码 = 模 - |原码|,这玩呢?前面这么多推理就是想用加法替代减法,结果搞了半天回到了原点,还使得计算减法,自己替代自己吗?替代了个寂寞……

不急,稍安勿躁,且听下面道来。

2.4.1 模

细想下 :补数的定义,使得当前数的位数增加1位

  • 假设二进制下,当前为8位,问要使得增加的数最小时,怎么才能使得位数增加1位呢,即由原来的8位变成9位?

答:增加的数为1时最小,此时当前8位数达到了最大,那就是0b 1111 1111,即0b 1111 1111 + 0b 0000 0001 = 0b 1 0000 0000

  • 所以我们找到了二进制8位数即将跳变成9位的临界值,即当前8位数的最大值0b 1111 1111
  • 二进制时,一个数变成最大的最快方式,当然是加上该数按位取反后的值。即 0b 1111 1111 - 0b 0000 0001 = 0b 1111 1110,看到了吗,0b 1111 1110正好等于0b 0000 0001按位取反的值,那就叫它反码吧,即原码为负数时,反码为原码数据位按位取反,注意这里是数据位,最高位为符号位“为使得定义一致和完整,我们补充:原码为0和正数时,原码等于反码
    在这里插入图片描述
  • 我们来求下
    在这里插入图片描述
  • 如上图所示,原码为负数时,模 (256) = 8bit最大值 + 1 , 8bit最大值 = 原码的绝对值 + 反码,结合之前的 原码为负数时,补码 = 模 - |原码| 得到:
    在这里插入图片描述
    至此,1 Byte 的数据我们通过补码的形式用加法替代了减法。计算机语言内的整数类型比如java int (4Byte)、long(8Byte) 都是如此。

三、总结

为了使用加法替代加法,我们先后引入了补数、模、原码、补码、反码等概念:

  • 圆盘代表数字是有范围的,该范围的大小即为,并且会首尾相连。计算机1 Byte、4Byte、8Byte天然会限定数据的范围。数据范围限定后,数据一直累计下去一定会产生数据溢出(即进位丢失),从而结束当前轮回,开始下一轮回;
  • 圆盘内的数字是原码,圆盘外的数字是补码,补码也是内的无符号整数。注意,反码 + 1只是求得补码的一种方式,并非补码的定义;
  • 原码为0和正数时,原码等于反码等于补码;
  • 原码为负数时,反码为原码数据位按位取反。

相关文章:

深入理解计算机中的补码、反码、原码

问题&#xff1a; 我们每天用的钟表&#xff0c;其实只有1~12这12个数字&#xff0c;但我们日常会说13点、17点之类的。 问&#xff1a;13点在钟表上哪个位置&#xff1f; 答&#xff1a;很简单嘛&#xff0c;1点的位置。 你不觉得奇怪吗&#xff0c;为啥13点会和1点在同一个位…...

Scratch教学作品 | 白水急流——急流勇进,挑战反应极限! ‍♂️

今天为大家推荐一款刺激又好玩的Scratch冒险作品——《白水急流》&#xff01;由AgentFransidium制作&#xff0c;这款作品将带你体验惊险的急流救援任务&#xff0c;帮助那位“睡着的疯狂人”安全穿越湍急水域&#xff01;想要挑战自己的反应极限&#xff1f;快来试试吧&#…...

Px4 V2.4.8飞控Mavlink命令控制说明

首先&#xff0c;可以使用两种方法连接飞控&#xff0c;使用虚拟机&#xff08;LINUX&#xff09;或使用地面站&#xff08;QGC&#xff09;连接。 在px4的代码文件位置打开命令终端&#xff0c;输入连接命令&#xff1a; ./Tools/mavlink_shell.py 在控制台使用help来获取所有…...

Linux(Ubuntu24.04)源码编译安装VTK7.1.1记录

VTK&#xff08;Visualization Toolkit&#xff09;是一个开源的3D可视化开发工具包&#xff0c;用于开发可视化和图形处理应用程序。VTK提供了一系列的算法和工具&#xff0c;用于创建、渲染和处理复杂的3D图形和数据。VTK由C编写&#xff0c;并提供了Python、Java和Tcl等语言…...

【Go学习】-01-4-项目管理及协程

【Go学习】-01-4-项目管理及协程 1 项目管理1.1 包1.1.1 包的基本概念1.1.2 包的导入1.1.3 包的导入路径1.1.4 包的引用格式 1.2. go mod1.2.1 项目中使用 2 协程并发2.1 并发2.2 Goroutine2.2.1 使用2.2.2 GMP2.2.2.1 Golang “调度器” 的由来2.2.2.2 Go 语言的协程 goroutin…...

ES_如何设置ElasticSearch 8.0版本的匿名访问以及https_http模式的互相切换

总结&#xff1a; 设置匿名访问&#xff0c;只需要设置xpack.security.authc.anonymous.username和xpack.security.authc.anonymous.roles参数就行&#xff0c;设置好后&#xff0c;可以匿名访问也可以非匿名访问&#xff0c;但是非匿名访问的情况下必须保证用户名和密码正确 取…...

PySide6 SQLite3 做的 电脑组装报价系统

一、数据库结构说明 1. 配件类别表 (component_categories) 字段名类型说明约束category_idINTEGER类别IDPRIMARY KEY, AUTOINCREMENTcategory_nameTEXT类别名称NOT NULL, UNIQUEdescriptionTEXT类别描述 2. 配件表 (components) 字段名类型说明约束component_idINTEGER配件…...

逻辑回归(Logistic Regression) —— 机器学习中的经典分类算法

1. 逻辑回归简介 逻辑回归是一种线性分类模型&#xff0c;常用于二分类问题。它通过学习特征权重&#xff0c;将输入映射为0 到 1 之间的概率值&#xff0c;并根据阈值将样本归入某一类别。逻辑回归使用Sigmoid 函数将线性结果转化为概率。 尽管名字中有“回归”&#xff0c;…...

【数据库系统概论】数据库完整性与触发器--复习

在数据库系统概论中&#xff0c;数据库完整性是指确保数据库中数据的准确性、一致性和有效性的一组规则和约束。数据库完整性主要包括实体完整性、参照完整性和用户定义完整性。以下是详细的复习内容&#xff1a; 1. 数据库完整性概述 数据库完整性是指一组规则&#xff0c;这…...

【机器学习:一、机器学习简介】

机器学习是当前人工智能领域的重要分支&#xff0c;其目标是通过算法从数据中提取模式和知识&#xff0c;并进行预测或决策。以下从 机器学习概述、有监督学习 和 无监督学习 三个方面进行介绍。 机器学习概述 机器学习定义 机器学习&#xff08;Machine Learning&#xff0…...

网关的主要类型和它们的特点

网关&#xff0c;作为网络通信的关键节点&#xff0c;根据其应用场景和功能特点&#xff0c;可以分为多种类型。 1.协议网关 特点&#xff1a; • 协议转换&#xff1a;协议网关的核心功能是转换不同网络之间的通信协议。例如&#xff0c;它可以将IPv4协议的数据包转换为IPv6协…...

NDA:Non-Disclosure Agreement

NDA 是 Non-Disclosure Agreement 的缩写&#xff0c;中文通常翻译为“保密协议”或“非披露协议”。其含义是&#xff1a;在协议约束下&#xff0c;协议的签署方有义务对协议中规定的信息或内容保密&#xff0c;不能向协议之外的第三方披露。 通常&#xff0c;NDA适用于以下场…...

方正畅享全媒体新闻采编系统 imageProxy.do 任意文件读取漏洞复现(附脚本)

0x01 产品描述: 方正畅享全媒体新闻生产系统是以内容资产为核心的智能化融合媒体业务平台,融合了报、网、端、微、自媒体分发平台等全渠道内容。该平台由协调指挥调度、数据资源聚合、融合生产、全渠道发布、智能传播分析、融合考核等多个平台组成,贯穿新闻生产策、采、编、…...

OpenHarmony通过挂载镜像来修改镜像内容,RK3566鸿蒙开发板演示

在测试XTS时会遇到修改产品属性、SElinux权限、等一些内容&#xff0c;修改源码再编译很费时。今天为大家介绍一个便捷的方法&#xff0c;让OpenHarmony通过挂载镜像来修改镜像内容&#xff01;触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器&#xff0c;树…...

代理模式和适配器模式有什么区别

代理模式&#xff08;Proxy Pattern&#xff09;和适配器模式&#xff08;Adapter Pattern&#xff09;是两种结构型设计模式&#xff0c;它们看似相似&#xff0c;但在设计意图、使用场景以及功能上有一些显著的区别。下面是它们的主要区别&#xff1a; 1. 目的与意图 代理模…...

2025年度全国会计专业技术资格考试 (甘肃考区)报名公告

2025年度全国会计专业技术资格考试 &#xff08;甘肃考区&#xff09;报名公告 按照财政部、人力资源和社会保障部统一安排&#xff0c;2025年度全国会计专业技术初级、中级、高级资格考试报名即将开始&#xff0c;现将甘肃考区有关事项通知如下&#xff1a; 一、报名条件 …...

ansible-playbook 搭建JDK

文件目录结构 main.yml #首先检测有无java&#xff0c;没有才会安装&#xff0c;有了就直接跳过 - name: Create installation directoryfile: path/var/www/ statedirectory- name: Check javashell: . /etc/profile && java -versionregister: resultignore_errors…...

数据结构(ing)

学习内容 指针 指针的定义&#xff1a; 指针是一种变量&#xff0c;它的值为另一个变量的地址&#xff0c;即内存地址。 指针在内存中也是要占据位置的。 指针类型&#xff1a; 指针的值用来存储内存地址&#xff0c;指针的类型表示该地址所指向的数据类型并告诉编译器如何解…...

杰盛微 JSM4056 1000mA单节锂电池充电器芯片 ESOP8封装

JSM4056 1000mA单节锂电池充电器芯片 JSM4056是一款单节锂离子电池恒流/恒压线性充电器&#xff0c;简单的外部应用电路非常适合便携式设备应用&#xff0c;适合USB电源和适配器电源工作&#xff0c;内部采用防倒充电路&#xff0c;不需要外部隔离二极管。热反馈可对充电电流进…...

webpack5基础(上篇)

一、基本配置 在开始使用 webpack 之前&#xff0c;我们需要对 webpack 的配置有一定的认识 1、5大核心概念 1&#xff09;entry &#xff08;入口&#xff09; 指示 webpack 从哪个文件开始打包 2&#xff09;output&#xff08;输出&#xff09; 制视 webpack 打包完的…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...