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

什么是原码和补码

补码的本质确实是模运算(Modular Arithmetic),这是理解补码为何能统一加减法的核心数学原理。下面用最通俗的语言和例子解释清楚:
—### 1. 先理解什么是“模运算”- 模运算就是“周期性计数”,比如钟表: - 钟表只有12小时,超过12就重新开始(模12)。 - 例如:15点 → 15 - 12 = 3点(15 mod 12 = 3)。 - 负数例子:如果现在是3点,8小时前是几点? - 直接减:3 - 8 = -5 → 负数无法直接表示在钟表上。 - 用模运算转换:-5 + 12 = 7 → 7点(相当于-5 ≡ 7 mod 12)。—### 2. 计算机的“模”是什么?- 计算机的二进制位数是固定的(比如8位、32位),天然适合模运算。 - n位二进制的模是 (2^n): - 例如:8位二进制的模是 (2^8 = 256)。 - 所有运算结果超出位数时,自动丢弃高位(相当于取模)。—### 3. 补码的本质:用模运算表示负数- 核心思想:将负数转换为一个等效的正数(通过模运算),让加减法统一为加法。 - 例如:在8位系统中,如何表示 -5? - 计算:(256 - 5 = 251) → 251 的二进制是 1111 1011,这就是 -5 的补码。 - 验证5 + (-5) = 0 → 补码运算: 5(0000 0101) + 251(1111 1011) = 256(1 0000 0000) → 丢弃溢出位 → 0000 0000(0,正确!)—### 4. 为什么补码能统一加减法?- 所有负数都表示为“模 - 绝对值”: - 在8位系统中,-x ≡ (2^8 - x)(即 (256 - x))。 - 加减法等价于模运算: - 例如:A - BA + (256 - B) mod 256。 - 硬件自动丢弃溢出位,结果自然正确。#### 案例:用钟表理解补码- 问题:钟表时间是3点,如何表示“-5小时”? - 直接减:3 - 5 = -2 → 无法直接表示。 - 用模12转换:-5 ≡ 12 - 5 = 7 → 加7小时: - 3点 + 7小时 = 10点 → 等价于3点 -5小时 = 10点(正确,因为钟表是循环的)。 - 计算机同理:用补码将负数转换为等效正数,运算后自动取模。—### 5. 补码的数学公式- 对于n位二进制,补码的定义: - 正数:直接表示。 - 负数:(-x) 的补码 = (2^n - x)。- 运算规则: - (A + (-B)) ≡ (A + (2^n - B)) ≡ (A - B) mod (2^n)。#### 案例:8位系统中计算 10 - 71. 转换为补码加法:10 + (-7)2. 计算补码: - -7 的补码 = 256 - 7 = 249 → 二进制 1111 1001。3. 运算0000 1010(10) + 1111 1001(-7的补码) = 1 0000 0011 → 丢弃溢出 → 0000 0011(3,正确!)—### 6. 补码的直观优势1. 符号位即数值: - 最高位是1时,代表这个数是“模 - 正数”。 - 例如:8位补码 1000 0001 = (256 - 127 = 129) → 实际表示 -127。2. 硬件无需区分正负: - 加减法统一用加法器完成,符号位直接参与运算。3. 自然处理溢出: - 运算结果超出位数时,丢弃高位即等效于取模。—### 总结- 补码是模运算在计算机中的具体应用: - 负数 -x 被表示为 (2^n - x)。 - 加减法统一为加法,结果自动取模。- 记住这个公式: - 在n位系统中-x ≡ (2^n - x)(这就是补码的好的!这次我们彻底讲透,用最直观的方式,结合数学原理和实际案例,保证你理解并记住。


终极目标:计算机如何用二进制表示负数,并正确运算?

关键矛盾:
  • 计算机只能处理 0 和 1,没有“负号”
  • 必须用纯二进制数同时表示正数和负数
  • 加减法必须统一用加法电路完成(否则硬件成本高)。

一、原码:直观但缺陷明显

定义
  • 最高位为符号位:0 正,1 负。
  • 其他位为数值的绝对值
  • 例子(8位):
    • +50 000 0101(符号位+5的绝对值)
    • -51 000 0101(符号位+5的绝对值)
致命问题
  • 直接运算会出错
    # 计算 5 + (-5):0000 0101  (+5)
    + 1000 0101  (-5)
    = 1000 1010  (十进制是 -10,但正确结果应为 0!)
    
  • 双零问题0000 0000(+0)和 1000 0000(-0)同时存在。

二、反码:试图改进运算

定义
  • 正数:与原码相同。
  • 负数:符号位不变,数值位取反(0→1,1→0)。
  • 例子(8位):
    • -51 111 1010(原码1000 0101的数值位取反)
运算尝试
  • 计算 5 + (-5)
      0000 0101  (+5的反码)
    + 1111 1010  (-5的反码)
    = 1111 1111  (反码的-0,十进制为 0,但有两个零)
    
  • 问题
    1. 双零问题依然存在0000 00001111 1111)。
    2. 需要处理进位:如果运算后最高位有进位,需循环加回结果末尾。

三、补码:彻底解决问题的终极方案

定义
  • 正数:与原码相同。
  • 负数:反码 + 1(等价于用模运算表示负数)。
  • 例子(8位):
    • -5 的补码:
      原码:1000 0101
      反码:1111 1010  (数值位取反)
      补码:1111 1011  (反码 +1)
      
补码的数学原理
  • 本质是模运算(钟表原理)

    • 假设用 8 位二进制(范围 0~255),模为 256。
    • 负数 -x 等价于 模 - x
      • -5256 - 5 = 251 → 二进制 1111 1011(这就是补码)。
  • 运算自动溢出

    # 计算 5 + (-5):0000 01015的补码)
    + 1111 1011-5的补码)
    = 1 0000 0000  (结果超出 8 位,最高位 1 被丢弃)
    → 最终结果:0000 00000,正确!)
    
补码的绝对优势
  1. 统一加减法:减法 A - B 等于 A + (-B) 的补码加法。
  2. 符号位直接参与运算:无需额外判断符号。
  3. 单零问题:只有 0000 0000 表示 0。
  4. 硬件电路简单:只需一个加法器,无需减法器。

四、补码的深度案例解析

案例1:8位补码范围
  • 最大正数0111 1111 → +127。
  • 最小负数1000 0000 → -128。
  • 为什么是 -128?
    • 8位补码中,1000 0000 没有对应的原码,直接规定为 -128。
    • 数学上:1000 0000 = -128(因为 -128 + 127 = -1,而 1000 0000 + 0111 1111 = 1111 1111(-1的补码))。
案例2:补码的快速转换
  • 已知补码求十进制

    • 补码 1111 1011
      1. 符号位为 1 → 负数。
      2. 数值位取反加1:1111 1011 → 取反 0000 0100 → 加1 → 0000 0101 → 绝对值 5。
      3. 结果:-5。
  • 十进制转补码

    • -20 的8位补码:
      1. +20 的原码:0001 0100
      2. 数值位取反:1110 1011
      3. 加1:1110 1100 → 这就是 -20 的补码。
案例3:跨零运算
  • 计算 3 - 5(等价于 3 + (-5)):
    3的补码:0000 0011
    -5的补码:1111 1011
    相加:0000 0011
    + 1111 1011
    = 1111 1110  (结果的补码)
    → 转十进制:符号位1 → 负数,数值位取反加10000 0010-2(正确!3-5=-2)。
    

五、为什么必须用补码?

  1. 硬件成本:补码让加减法统一用加法器实现,无需额外减法电路。
  2. 运算一致性:符号位直接参与运算,无需特殊处理。
  3. 单零问题:避免程序中出现 +0-0 的歧义。
  4. 数学严谨性:补码的本质是模运算,完美契合二进制溢出特性。

终极记忆口诀

  • 原码:看符号,算绝对值(但算不对)。
  • 反码:负数取反,双零还在(运算要加回进位)。
  • 补码:负数取反加一,符号直接运算(一切问题解决)。

总结表格

编码正数表示负数表示零的个数能否直接运算?
原码符号位0+绝对值符号位1+绝对值2个❌ 出错
反码同原码符号位1+数值位取反2个⚠️ 需处理进位
补码同原码符号位1+数值位取反+11个✅ 完美

彻底理解补码后,你就能看透计算机底层的一切数值运算!这就是为什么现代计算机全部使用补码。

相关文章:

什么是原码和补码

补码的本质确实是模运算(Modular Arithmetic),这是理解补码为何能统一加减法的核心数学原理。下面用最通俗的语言和例子解释清楚: —### 1. 先理解什么是“模运算”- 模运算就是“周期性计数”,比如钟表: -…...

ppy/osu构建

下载 .NET (Linux、macOS 和 Windows) | .NET dotnet还行 构建:f5 运行:dotnet run --project osu.Desktop -c Debug...

基于几何布朗运动的股价预测模型构建与分析

基于几何布朗运动的股价预测模型构建与分析 摘要 本文建立基于几何布朗运动的股价预测模型,结合极大似然估计与蒙特卡洛模拟,推导股价条件概率密度函数并构建动态预测区间。实证分析显示模型在标普500指数预测中取得89%的覆盖概率,波动率估…...

使用交互式半自动化标注工具制作语义分割数据集

参考的初始资源: GitHub项目文档 B站视频 1.安装工具 打开Anaconda Prompt 1.创建虚拟环境 conda create -n isat_env python3.8 conda activate isat_env2.安装GPU版本pytorch 4070 Ti CUDN12.5 pip install torch torchvision torchaudio --index-url https:/…...

deepseek梳理java高级开发工程师微服务面试题

Java微服务高级面试题与答案 一、微服务架构设计 1. 服务拆分原则 Q1:微服务拆分时有哪些核心原则?如何解决拆分后的分布式事务问题? 答案: 服务拆分五大原则: 1. 单一职责原则(SRP)- 每个…...

二分查找算法的思路

二分查找思路总结 明确目标与单调性特点: 核心目标:寻找满足某种条件的答案(如最小/最大值)。单调性要求:需要证明你的判断函数具有单调性——即如果某个答案 T 可行,那么大于 T 的答案通常也是可行的&…...

(1)python开发经验

文章目录 1 安装包格式说明2 PySide支持Windows7 更多精彩内容👉内容导航 👈👉Qt开发 👈👉python开发 👈 1 安装包格式说明 PySide下载地址 进入下载地址后有多种安装包,怎么选择: …...

DAY05:深入解析生命周期与钩子函数

引言 在 Vue 开发中,生命周期和钩子函数是理解组件行为的关键。无论是初始化数据、操作 DOM,还是清理资源,生命周期钩子都提供了精确的控制点。本文将从基础理论出发,结合项目实战,详细剖析 Vue 3 的生命周期机制、组…...

python如何提取Chrome中的保存的网站登录用户名密码?

很多浏览器都贴心地提供了保存用户密码功能,用户一旦开启,就不需要每次都输入用户名、密码,非常方便。作为python脚本,能否拿到用户提前保存在浏览器中的用户名密码,用以自动登录呢?必须有,小爬…...

Redis实现分布式获取全局唯一自增ID的案例。

【1】简易自增版本(从 1 开始 1,2,3,...) 项目结构 下面是一个基于 RedisTemplate 实现的分布式全局唯一自增 ID 生成器的案例。适用于 Java Spring Boot 环境,利用 Redis 的原子操作 INCR 指令。 ✅ 原理说明 Redis 提供的 INCR 命令是原子性的&…...

人脸识别备案:筑牢人脸信息 “安全墙”

人脸识别备案制度主要依据《人脸识别技术应用安全管理办法》建立,人脸识别技术广泛应用于安防、金融、门禁、交通等领域,带来便利高效的同时,人脸信息安全问题也引发担忧。为规范技术应用、保护个人信息权益,人脸识别备案制度应运…...

基于RT-Thread的STM32F4开发第三讲——DAC

文章目录 前言一、DAC是什么?二、RT-Thread工程创建三、DAC函数编写1.DAC.c2.DAC.h3.main.c 四、结果测试五、工程分享 前言 本章利用RT-Thread最新的驱动5.1.0开发DAC模块,使用的开发板是正点原子的STM32F4探索者。很多配置和上文重复,本文…...

UE5通过C++实现TcpSocket连接

在 Unreal Engine 5 的 C 项目中,实现一个具备消息监听、心跳检测和断线重连功能的 TCP 客户端,可以参考以下完整示例。 准备工作 1、模块依赖 在 YourModule.Build.cs 文件中,添加对 Sockets 和 Networking 模块的依赖: Publ…...

网络状态可以通过hutool.HttpStatus获取

网络状态可以通过hutool.HttpStatus获取 全部都是静态int类型...

Gemini 2.5 推动视频理解进入新时代

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

谈谈各种IO模型

目前的IO模型有5种:BIO(阻塞IO)、NIO(非阻塞IO)、IO多路复用、信号驱动IO、异步IO(AIO) 了解这些模型之前,我们需要先知道IO模型中的几个概念:阻塞&非阻塞、同步&am…...

基于STM32、HAL库的ADAU1701JSTZ音频接口芯片驱动程序设计

一、简介: ADAU1701JSTZ 是 Analog Devices 公司推出的一款高性能、低功耗音频编解码器 (CODEC) 芯片。它专为便携式音频设备设计,集成了麦克风前置放大器、ADC、DAC、耳机放大器等功能模块,支持多种音频接口和采样率,非常适合与 STM32 微控制器配合使用。 主要特性: 24…...

Linux系统管理与编程20:Apache

兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 做好网络和yum配置,用前面dns规划的www的IP进行。 #!/bin/bash #----------------------------------------------------------- # File Name: myWeb.sh # Version: 1.0 # …...

BFS算法篇——打开智慧之门,BFS算法在拓扑排序中的诗意探索(下)

文章目录 引言一、课程表1.1 题目链接:https://leetcode.cn/problems/course-schedule/description/1.2 题目分析:1.3 思路讲解:1.4 代码实现: 二、课程表||2.1 题目链接:https://leetcode.cn/problems/course-schedul…...

【入门】纸盒的最大体积是多少?

描述 在一张尺寸为 n * n 厘米的正方形硬纸板的四个角上,分别裁剪掉一个 m * m 厘米的小正方形,就可以做成一个无盖纸盒,请问这个无盖纸盒的最大体积是多少? 立方体的体积 v 底面积 * 高) 比如: n 5 &am…...

什么是Vim

Vim可是Linux中最强大、最受欢迎的文本编辑器之一,很多程序员、系统管理员都离不开它。要说清楚Vim的各种功能和用法,似乎有点长,但我会尽量用简单通俗的方式,把Vim的核心知识讲清楚,让你能一步一步开始使用它。 一、…...

QT5.14安装以及新建基础项目

进入qt中文网站:Qt | 软件开发全周期的各阶段工具 额,考虑新手可能还是找不到,我就分享一下我下载的的吧 通过网盘分享的文件:qt-opensource-windows-x86-5.14.2.exe 链接:https://pan.baidu.com/s/1yQTRp-b_ISje5B3UWb7Apw?pw…...

Java Spring MVC -01

SpringMVC 是一种基于 的实现 MVC 设计模式的请求驱动类型的轻量级 Web 框架,属于 Spring FrameWork 的后续产品,已经融合在 Spring Web Flow 中。 First:SpringMVC-01-SpringMVC 概述 SpringMVC 是 Spring 框架的一个模块,用于构建 Web 应…...

KV cache 缓存与量化:加速大型语言模型推理的关键技术

引言 在大型语言模型(LLM)的推理过程中,KV 缓存(Key-Value Cache) 是一项至关重要的优化技术。自回归生成(如逐 token 生成文本)的特性决定了模型需要反复利用历史token的注意力计算结果&#…...

视频编解码学习十一之视频原始数据

一、视频未编码前的原始数据是怎样的? 视频在未编码前的原始数据被称为 原始视频数据(Raw Video Data),主要是按照帧(Frame)来组织的图像序列。每一帧本质上就是一张图片,通常采用某种颜色格式…...

[Java实战]Spring Boot 3 整合 Apache Shiro(二十一)

[Java实战]Spring Boot 3 整合 Apache Shiro(二十一) 引言 在复杂的业务系统中,安全控制(认证、授权、加密)是核心需求。相比于 Spring Security 的重量级设计,Apache Shiro 凭借其简洁的 API 和灵活的扩…...

Cursor 编辑器 的 高级使用技巧与创意玩法

以下是针对 Cursor 编辑器 的 高级使用技巧与创意玩法 深度解析,涵盖代码生成优化、工作流定制、隐藏功能等层面,助你将 AI 辅助编程效率提升至新高度: 一、代码生成进阶技巧 1. 精准控制生成粒度 行级控制: 在代码行内用 // > 指定生成方向(替代模糊注释)def merge_…...

mysql性能提升方法大汇总

前言 最近在开发自己的小程序的时候,由于业务功能对系统性能的要求很高,系统性能损耗又主要在mysql上,而业务功能的数据表很多,单表数据量也很大,又涉及到很多场景的数据查询,所以我针对mysql调用做了优化…...

C++标准流详解:cin/cout的绑定机制与cerr/clog的缓冲差异

在C中,标准错误流(cerr)、标准日志流(clog)与标准输入输出流(cin/cout)的行为差异主要体现在缓冲机制和绑定关系上。以下是详细解释,并结合cin和cout的关联性进行对比分析&#xff1…...

BlockMesh Ai项目 监控节点部署教程

项目介绍 BlockMesh 是一个创新、开放且安全的网络,允许用户轻松地将多余的带宽货币化。 它为用户提供了被动获利并参与人工智能数据层、在线隐私、开源和区块链行业前沿的绝佳机会。 此教程为Linux系统教程 教程开始 首先到这里注册账号,注册后保存…...