计算机底层基石:原码、反码、补码、移码深度剖析
在计算机的世界里,所有数据最终都以二进制的形式进行存储与运算。原码、反码、补码和移码作为二进制数据的重要编码方式,对计算机实现高效数据处理起着关键作用。接下来,我们将深入剖析这几种编码。
一、原码
1.1 定义
原码是最简单的机器数表示法,能够直观反映数值的大小与正负。对于正数,原码等同于其本身的二进制表示;对于负数,原码是在其绝对值的二进制表示前加上符号位,“0” 表示正数,“1” 表示负数 。
以 8 位二进制为例:
+5 的原码写作:00000101。最高位 “0” 表明这是一个正数,后续 7 位 “0000101” 是 5 的二进制表示。
-5 的原码写作:10000101。最高位 “1” 表明这是一个负数,后续 7 位依然是 5 的二进制表示。
1.2 特点
原码最大的优势在于直观,易于理解,与真值的转换简单。然而,它在实际运算中存在诸多不便。在进行加减法运算时,符号位需要单独处理,这使得运算规则变得复杂。此外,数字 0 在原码中有两种表示形式:+0 的原码为 00000000,-0 的原码为 10000000。这种不唯一性会增加计算机存储与处理数据的难度。
1.3 运算示例
在原码运算中,以加法为例,如果两个数符号相同,可以直接将它们的绝对值相加,结果的符号保持不变;如果符号不同,需要比较两个数绝对值的大小,用较大的绝对值减去较小的绝对值,结果的符号取绝对值较大的数的符号。
如计算 5 + 3:
5 的原码:00000101
3 的原码:00000011
将对应位相加,得到:00001000,即 8 的原码。
而计算 5 + (-3) 时:
5 的原码:00000101
-3 的原码:10000011
由于符号位不同,需要进行减法操作,且要比较绝对值大小,运算过程较为繁琐。
二、反码
2.1 定义
反码的表示规则为:正数的反码与原码相同;负数的反码是在原码的基础上,除符号位外,其余各位按位取反。
以 8 位二进制为例:
+5 的反码:00000101,与原码一致。
-5 的原码:10000101,其反码为 11111010,即除符号位 “1” 外,其余各位 “0000101” 按位取反。
2.2 特点
反码主要作为原码到补码转换过程中的中间过渡。与原码类似,反码也存在 0 表示不唯一的问题。+0 的反码是 00000000,-0 的反码是 11111111,这限制了反码在计算机中的直接应用。
2.3 运算示例
在反码运算中,加法规则相对复杂。若两个数相加产生进位,需要将进位加到结果的最低位。
如计算 (-1) + (-2):
-1 的原码:10000001,反码:11111110
-2 的原码:10000010,反码:11111101
将两个反码相加:11111110 + 11111101 = 111111011,产生了进位。将进位加到结果的最低位,得到 11111110,其对应的原码为 10000001,即 - 3。
三、补码
3.1 定义
正数的补码与原码相同,负数的补码是在其反码的末位加 1。
以 8 位二进制为例:
+5 的补码:00000101,与原码一致。
-5 的原码:10000101,反码:11111010,补码则为 11111010 + 1 = 11111011。
3.2 特点
补码的出现,成功解决了原码和反码中存在的问题。在计算机中,采用补码进行运算,能够将减法运算转化为加法运算,极大地简化了计算机的运算电路。在补码表示中,0 的表示是唯一的,均为 00000000。此外,补码可以多表示一个最小负数。以 8 位二进制补码为例,其表示范围是 - 128 到 + 127。
3.3 运算示例
使用补码进行运算时,无需考虑符号位,直接进行加法运算即可。
如计算 5 - 3,可转化为 5 + (-3):
5 的补码:00000101
-3 的原码:10000011,补码:11111101
将两个补码相加:00000101 + 11111101 = 00000010,即 2 的补码,与正确结果相符。
四、移码
4.1 定义
移码通常用于表示浮点数的阶码,它是在补码的基础上,将符号位取反得到的。在 8 位二进制系统中,常设定偏移量为 128。
以 8 位二进制为例:
+5 的补码:00000101,移码:10000101
-5 的补码:11111011,移码:01111011
4.2 特点
移码最大的优势在于方便比较两个数的大小。由于移码是在补码的基础上对符号位取反,使得移码表示的数在数轴上是连续的,其大小顺序与真值的大小顺序一致。这一特性在进行浮点数的阶码比较时非常有用,有助于计算机高效地进行浮点数运算和处理。
4.3 运算示例
在浮点数运算中,通过比较两个数的移码大小,可以快速确定它们的相对大小。例如,在进行两个浮点数的乘法或除法运算时,首先需要比较它们的阶码大小,移码表示使得这一比较过程变得简单直接。
五、应用场景
5.1 原码应用
原码在一些对运算精度和速度要求不高,且更注重数据直观表示的场景中仍有应用。在一些简单的计算机控制系统或数字电路设计中,原码可以用于快速验证算法或逻辑的正确性。
5.2 反码应用
虽然反码本身在实际应用中并不广泛,但在一些早期的计算机系统中,反码作为原码到补码转换的中间步骤,起到了重要的过渡作用。
5.3 补码应用
补码是计算机中最常用的编码方式,广泛应用于 CPU 运算、内存存储等方面。几乎所有现代计算机的整数运算都采用补码形式,以提高运算效率和准确性。
5.4 移码应用
移码主要应用于浮点数的表示和运算中。在科学计算、图形处理等对浮点数运算要求较高的领域,移码能够有效地提高计算速度和精度。
六、总结
原码、反码、补码和移码作为计算机中重要的编码方式,各自具有独特的特点和应用场景。原码直观易懂,但运算不便;反码作为过渡编码,解决了部分问题;补码通过巧妙的设计,实现了减法到加法的转换,成为计算机运算的基础;移码则在浮点数运算中发挥了重要作用。深入理解这些编码方式,有助于我们更好地掌握计算机的工作原理,为开发更高效、更强大的计算机系统奠定基础。
相关文章:
计算机底层基石:原码、反码、补码、移码深度剖析
在计算机的世界里,所有数据最终都以二进制的形式进行存储与运算。原码、反码、补码和移码作为二进制数据的重要编码方式,对计算机实现高效数据处理起着关键作用。接下来,我们将深入剖析这几种编码。 一、原码 1.1 定义 原码是最简单…...
第十四章:JSON和CSV格式详解及Python操作
在数据处理和开发工作中,JSON和CSV是两种非常常见的数据格式。它们各有特点,适用于不同的场景。本文将分别介绍这两种格式的产生原因、应用场景,并结合Python讲解如何操作这两种文件格式,最后用表格总结它们的常用操作及特性。资源…...
双磁条线跟踪控制
1问题 同学反馈小车跟随磁力线,双轮差速小车,左右侧各有2个磁条传感器和各1条磁条线,需要控制小车跟随磁条线轨迹。 2 方法 (1)普通小车可能没有速度反馈,则不考虑转弯半径,仅考虑一个控制关…...
【每日算法】Day 12-1:滑动窗口算法精讲——子串/子数组问题的优化利器(C++实现)
攻克子串问题的效率密码!今日深入解析滑动窗口算法的核心思想与实战技巧,覆盖最小覆盖子串、最长无重复子串等高频场景,彻底掌握O(n)时间复杂度的窗口滑动艺术。 一、滑动窗口核心思想 滑动窗口(Sliding Window) 是一…...
树莓派超全系列文档--(7)RaspberryOS播放音频和视频
播放音频和视频 播放音频和视频VLC 媒体播放器vlc GUIvlc CLI使用 cvlc 在没有图形用户界面的情况下播放媒体 在 Raspberry Pi OS Lite 上播放音频和视频指定音频输出设备指定视频输出设备同时指定音频和视频输出设备提高数据流播放性能 文章来源: http://raspberr…...
chrome浏览器下载和Chrome浏览器的跨域设置
Chrome浏览器的跨域设置 下载chrome浏览器设置chrome跨域 下载chrome浏览器 点击官方下载,然后逐步安装即可 设置chrome跨域 1、然后在D盘创建个文件夹命名为ChromeDevSession。 2、右击chrome浏览器选择属性。 3、在目标编辑栏的最后加上:–disabl…...
Android14 SystemUI中添加第三方AIDL
由于特殊需求,需要在SystemUI中添加第三方AIDL,去做一些客制化的修改。现在记录一下AIDL添加的过程。 1.将AIDL文件拷贝到frameworks/base/packages/SystemUI/src/下,我要添加的AIDL文件是com/test/myctr/IDevicectr.aidl,添加后的…...
Appium中元素定位之一组元素定位API
应用场景 和定位一个元素相同,但如果想要批量的获取某个相同特征的元素,使用定位一组元素的方式更加方便 在 Appium 中定位一组元素的 API 与定位单个元素的 API 类似,但它们返回的是一个元素列表(List<MobileElement>&am…...
【高并发内存池】第六弹---深入理解内存管理机制:ThreadCache、CentralCache与PageCache的回收奥秘
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】【项目详解】 目录 1、threadcache回收内存 2、centralcache回收内存 3、pagecache回收内存 1、threadcache回收内…...
累积分布策略思路
一种基于概率密度和累积分布函数的量化交易策略,主要应用于期货市场。该策略通过计算价格数据的概率密度和累积分布函数(CDF),结合移动平均线和ATR(平均真实范围)等技术指标,实现多空交易的自动…...
【JavaScript】九、JS基础练习
文章目录 1、练习:对象数组的遍历2、练习:猜数字3、练习:生成随机颜色 1、练习:对象数组的遍历 需求:定义多个对象,存数组,遍历数据渲染生成表格 let students [{ name: 小明, age: 18, gend…...
RAG、大模型与智能体的关系
一句话总结: RAG(中文为检索增强生成) 检索技术 LLM 提示。 RAG、大模型与智能体的关系解析 1. 核心概念定义 RAG(检索增强生成) 是一种结合信息检索与生成式模型的框架,通过从外部知识库(如…...
使用firewall-cmd配置SIP端口转发,实现双网卡互通,内外网方式
使用firewall-cmd配置SIP端口转发,实现双网卡,内外网方式 脚本内容 这里以内网IP: 192.168.2.88 这里以外网IP: 10.3.3.3 以下是一个用于启用和停用端口转发的Shell脚本: #!/bin/bash# 配置变量 ZONE"public" TARGET_IP"192.168.2.88" POR…...
Oracle数据库数据编程SQL<3.2 PL/SQL 匿名块中的DML操作、动态SQL、实际应用场景、使用技巧>
匿名块是学习和测试PL/SQL代码的强大工具,特别适合执行一次性任务或快速验证业务逻辑。 目录 一、匿名块中的DML操作 1. INSERT 示例 2. UPDATE 示例 3. DELETE 示例 二、匿名块中的动态SQL 1. EXECUTE IMMEDIATE 2. 动态游标--下篇文章会具体展开详细分享该…...
Spring AI Alibaba 实战:集成 OpenManus 实现智能体应用开发
引言 2024 年 9 月,阿里云正式开源 Spring AI Alibaba,为 Java 开发者提供了一套完整的 AI 应用开发框架,支持与通义系列大模型深度集成,并覆盖了从模型调用到云原生部署的全链路能力。而近期,中国团队发布的通用型 A…...
Linux中《进程状态--进程调度--进程切换》详细介绍
目录 进程状态Linux内核源代码怎么说运行&&阻塞&&挂起内核链表 进程状态查看Z(zombie)-僵尸进程僵尸进程危害孤儿进程 进程优先级进程切换Linux2.6内核进程O(1)调度队列 进程状态 Linux内核源代码怎么说 为了弄明白正在运⾏的进程是什么意思,我们…...
Element PlusAnt-design常问问题详解
Element UI Plus 高频面试问题解析(2025 版) 一、核心组件使用与原理 动态表头实现方案 • 场景:如何根据接口数据动态生成表头? • 技术方案: ◦ 使用 v-for 遍历表头数组生成 el-table-column ◦ 结合 render-header 属性实现复杂表头(如带提示的标题) ◦ 示例代码:通…...
【商城实战(96)】打造商城监控利器Prometheus与Grafana
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
Megatron-LM中的deepseek-v3实现
Megatron-LM:https://github.com/NVIDIA/Megatron-LM/tree/main 使用此仓库构建的著名的库也有很多,如: Colossal-AI, HuggingFace Accelerate, and NVIDIA NeMo Framework.Pai-Megatron-Patch工具是阿里人工智能平台PAI算法团队研发,ai-Megatron-Patch…...
SpringCloud如何整合DeepSeek
SpringCloud 整合 DeepSeek 的核心目标是通过微服务架构调用其分布式文件系统(如 3FS)或 API 服务。以下从技术选型、整合步骤和关键配置三个方面展开说明: 一、技术选型与架构分析 DeepSeek 服务类型 3FS 分布式文件系统:基于 RD…...
蓝桥杯备考:多米诺骨牌
这道题要求上下方格子和之差要最小,其实就是算每个上下格子的差求和的最小值 这道题其实是动态规划01背包问题 我们直接按步骤做吧 step1:定义状态表示f[i][j]表示从1到i个编号的差值里选出刚好j个数的最小操作次数 step2:推导状态转移方程 如图这就是我们的状态…...
wireshark开启对https密文抓包
HTTPS抓包解密指南 通常情况下,Wireshark只能抓取HTTP的明文包,对于HTTPS的报文需要特殊设置才能抓取。如果不进行设置,抓取到的都是TLS加密报文,这对调试工作造成了很大困难。 前言 提到HTTPS抓包,基本都绕不开SSL…...
AudioFlinger与AudioPoliceManager初始化流程
AF/APF启动流程 在启动AudioSeriver服务的过程中会对启动AF/APF。main_audioserver.cpp有如下代码: AudioFlinger::instantiate();AudioPolicyService::instantiate();AF初始化流程 1.AudioFlinger::instantiate() 1.1 AudioFlinger构造函数 void AudioFlinger:…...
网路传输层UDP/TCP
一、端口号 1.端口号 1.1 五元组 端口号(port)标识了一个主机上进行通信的不同的应用程序. 如图所示, 在一个机器上运行着许多进程, 每个进程使用的应用层协议都不一样, 比如FTP, SSH, SMTP, HTTP等. 当主机接收到一个报文中, 网络层一定封装了一个目的ip标识我这台主机, …...
Python大数据处理 基本的编程方法
目录 一、实验目的 二、实验要求 三、实验代码 四、实验结果 五、实验体会 一、实验目的 体会基本的python编程方法;学习python中的各类函数;了解python读取与写入文件的方法。 二、实验要求 输入2000年后的某年某月某日,判断这一天是…...
STM32F103_LL库+寄存器学习笔记06 - 梳理串口与串行发送“Hello,World“
导言 USART是嵌入式非常重要的通讯方式,它的功能强大、灵活性高且用途广泛。只停留在HAL库层面上用USART只能算是入门,要加深对USART的理解,必须从寄存器层面入手。接下来,先从最简单的USART串行发送开始。 另外,在接…...
硬件基础--14_电功率
电功率 电功率:指电流在单位时间内做的功(表示用电器消耗电能快慢的一个物理量)。 单位:瓦特(W),简称瓦。 公式:PUI(U为电压,单位为V,i为电流,单位为A,P为电功率,单位为W)。 单位换算:进位为1000ÿ…...
【C#语言】C#文件操作实战:动态路径处理与安全写入
文章目录 ⭐前言⭐一、场景痛点⭐二、完整实现代码⭐三、关键技术解析🌟1、动态路径处理🌟2、智能目录创建🌟3、安全的文件写入 ⭐四、进阶扩展方案🌟1、用户自定义路径选择🌟2、异常处理增强🌟3、异步写入…...
Vue.js 完全指南:从入门到精通
1. Vue.js 简介 1.1 什么是 Vue.js? Vue.js(通常简称为 Vue)是一个用于构建用户界面的渐进式 JavaScript 框架。所谓"渐进式",意味着 Vue 的设计是由浅入深的,你可以根据自己的需求选择使用它的一部分或全部功能。 Vue 最初由尤雨溪(Evan You)在 2014 年创…...
在Git仓库的Readme上增加目录页
一般在编写Readme时想要增加像文章那样的目录,方便快速跳转,但是Markdown语法并没有提供这样的方法,但是可以通过超链接结合锚点的方式来实现,如下图是我之前一个项目里写的Readme: 例如有下面几个Readme内容ÿ…...
