计算机组成与体系结构:补码数制二(Complementary Number Systems)

news2025/6/8 17:17:03

 

目录

  4位二进制的减法 

 补码系统

🧠减基补码

名字解释:

减基补码有什么用?

计算方法

❓为什么这样就能计算减基补码

💡 原理揭示:按位减法,模拟总减法!

那对于二进制呢?(b = 2)

 🧠 基补码

名字解释: 

计算方法 

❓ 为什么用基补码就可以实现减法运算? 

什么是模 b^n 运算?

回顾逻辑链条

 完整比较表:减基补码 vs 基补码


 4位二进制的减法 

我们用这个4位二进制的减法例子:

A = 1000(即十进制的 8)

B = 0001(即十进制的 1)

我们希望计算:A - B = 1000 - 0001 = ?

借位时:

  • 从左边借一个 1,即从第二位借变成 1 → 0

  • 当前位变成 2(二进制中的 10)

 

 上面的减法需要手动借位,非常繁琐,而且不适合电路实现。为了解决这个问题,引入了补码数制,使减法变成加法。 


 补码系统

对于任意进制为 b 的数字系统,存在两种常用的补码定义,用来表示负数、简化减法:

  • (b−1)’s complement(减基补码):用于模拟借位操作

  • b’s complement(基补码):常用于计算机系统,能将减法直接变为加法

在任意进制 b 中,对一个非负数 N 的补码,我们关心的是:

怎么用某个“补”的方式,表示 “−N”,从而让:

这和二进制补码的思想完全一致,但现在是推广到任意进制 b。 

🧠减基补码

(中文:减基补码 / 英文:Diminished Radix Complement)

名字解释:

  • b”:表示进制(base),比如十进制是 10,二进制是 2

  • b−1”:是进制的最大一位数字

    • 十进制里是 9

    • 二进制里是 1

  • complement”:英文意思是“补码”或“补数”,意思是某种“差值”

  • 所以你可以理解为:

    减基补码,就是“对每一位,求它距离最大位值(b−1)的差”

这就是“按位取反”的来源。

所以:

对于任意进制为 b 的数字系统,给定一个 n 位非负数 N,它的减基补码是:

换句话说:

  • 我们在“最大可能的数值”上(即 b^n - 1)减去当前数

  • 或者更直观地说:

    将每一位数字都用 (b−1) 减去它自己

减基补码有什么用?

它主要用于:将减法转化为加法

我们可以这样写:

比如:

  • 73 - 25 可以用补码方式计算为:

最后结果取最后两位:48 ✅

(这个“只保留低位”在计算机中称为模运算)

计算方法

  1. 确定当前进制 b,以及数的位数 n

  2. 将每一位数字用 b−1减去它

  3. 得到的新数就是减基补码

✴️ 例子 :十进制(b = 10)

我们来求 372 的 9’s complement

因为 10 − 1 = 9,所以是 9's complement

步骤:

  • 原数:3 7 2

  • 每位做:9 - 3 = 6, 9 - 7 = 2, 9 - 2 = 7

  • 结果:627

为什么这样就能计算减基补码

补码(complement)的目的是:

让我们在“不会借位”的前提下完成减法
也就是说:我们希望能把减法 A − B,变成 A + 某个东西,而这个“某个东西”要能代表“负的 B”。

怎么代表 “负的 B”?

假设我们工作在一个固定长度的进制系统中:比如在十进制里,用 3 位数 ⇒ 最大值是 999

所以,整个空间就是从 000 到 999

在这种情况下: - B = 1000 - B

 这是 “基补码” b’s complement = b^n - B (后面会提到)

那么:

核心公式解释:

给你一个 3 位数 B = 372,我们想知道怎么快速得到:

999 - 372 = ?

是不是需要手动减法?太麻烦了!

有没有一种快速的方法呢?有的!

💡 原理揭示:按位减法,模拟总减法!

来看看:

原数位372
减去999
得到627

你有没有发现?

我们是把 999 - 372,拆成了逐位相减的操作
即:(9 - 3)(9 - 7)(9 - 2) = 627

那我们为什么可以这样逐位减?

我们再来深入看一下:

这是减基补码的核心定义:

✅ “(b^n - 1) − N” 是什么?

它是一个固定数(最大值)减去当前值
我们从数学角度知道:

  • 总差值 = 每位差值之和(如果没有进位或借位)

那我们就直接把每一位单独处理,从高位到低位,做:

b−1 - 当前位数字

这个方法就能快速等价于“总值减当前数”。

这就是我们所谓的:

把每一位都用最大可能的数减去它自己,省略了进位借位的麻烦。

那对于二进制呢?(b = 2)

  • 最大每位就是 1

  • 所以:1 - 当前位 就是“取反”:

原数0101
取反1010

所以:

在二进制里,(b−1)'s complement 就是“反码(Ones’ Complement)”

 减基补码的缺点

问题说明
有两个“零”000...0 表示 +0,但 999...9(或 111...1)表示 -0
需要手动加1加法后还要再加1,麻烦
不如 b’s complement(基补码)方便b’s complement 是在它基础上改进的,更常用

 🧠 基补码

b’s complement,中文叫“基补码”,英文全称是 Radix Complement,

是一种用于减法运算或表示负数的编码方式,适用于任何进制 b。 

名字解释: 

部分含义
b表示“进制”(base),例如:十进制 b=10,二进制 b=2
complement英文中意为“补码”、“补数”
Radix Complement“radix” 就是“进制”的正式英文术语,直译就是“进制的补数”

给定一个 n 位的正整数 N,它的基补码是: 

也可以理解为:

先求减基补码((b−1)’s complement),然后再加 1:

计算方法 

步骤1:确认进制 b 和位数 n

(比如十进制 3 位,最大值就是 b^n = 1000)

步骤2:用公式 b^n - N

✴️ 例子 :二进制(b = 2)

0101(十进制 5)的 2’s complement(也就是我们熟悉的补码)

  1. 先按位取反(就是 1’s complement):

0101 → 1010

再加 1:

1010 + 1 = 1011

✅ 所以:

2’s complement  of  0101 =  1011

这就是我们熟悉的“取反 + 加 1”,它其实就是 2’s complement。

为什么用基补码就可以实现减法运算? 

设定场景:我们处在一个有限数字空间里

我们假设一个 固定长度为 n 位的数字系统,进制为 b。

  • 总共能表示的数有:

    0 到 b^n - 1 (比如:3 位十进制是 000 到 999)

在这种系统下,所有加法、减法,其实都发生在一个“圈”里。这在数学中叫作模 b^n 算术(modulo arithmetic)。 

什么是模 b^n 运算?

任何计算超出这个范围,就“回绕”回来。

就像时钟是模 12 的系统:

 同理,十进制 3 位系统是模 1000 的系统:

我们希望把 A − B 变成 A + something

我们的问题是:

如何让 A − B,变成 A + ???

用模运算思维,我们知道:

因为:

这就是我们最核心的逻辑:

在模 b^n 意义下,负数 −B 可以表示成 b^n - B

所以你只要:

  • 不直接做 A − B

  • 而是把 B 换成 b’s complement(即 b^n - B),再和 A 相加

  • 最后把结果取模(保留低 n 位)

你就等价于完成了 A − B 的操作!

举个完整例子说明

用十进制,3 位(即模 1000)

设:

  • A = 100

  • B = 25

  • A − B = 75(目标)

我们来用 b’s complement 做:

  1. b’s complement of 25 = 1000 − 25 = 975

  2. A + 975 = 100 + 975 = 1075

  3. 1075 mod 1000 = 75

完全等价! 

回顾逻辑链条

  1. 我们想把减法变成加法,是因为计算机更容易做加法(电路简单)

  2. 所以要找到一种方式,把 “-B” 表示成一个“加数”

  3. 在模 b^n 的世界里:

  4. 所以:

  5. 而 b^n - B 就是 b’s complement of B

  6. 所以,我们通过补码的方式,就能完成减法!


 完整比较表:减基补码 vs 基补码

项目(b−1)’s Complement(减基补码)b’s Complement(基补码)
英文术语Diminished Radix ComplementRadix Complement
表达式(b^n - 1) - Nb^n - N
本质意义每位用 (b−1) 减去原位数在 (b−1)’s complement 基础上再加 1
是否等价于负数 −N(模意义)否,除非尾进位补偿✅ 是
是否适应进位(carry)❌ 不能直接使用,需要“尾进位回加”✅ 自动处理进位
减法实现方式A + (b−1)’s complement(B) + 1,或加后尾加进位A + b’s complement(B),直接做
是否容易硬件实现❌ 难(因需判断进位)✅ 易(适合加法器)
是否存在两个“0”✅ 有:0000 和 9999(或 1111)❌ 只有一个“0”
二进制特例1’s complement(反码)2’s complement(补码)
是否常用于现代计算机❌ 否(仅历史背景)✅ 是(普遍使用)
易读性✅ 简单按位减❌ 稍复杂,需要加1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2404355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#使用MindFusion.Diagramming框架绘制流程图(2):流程图示例

上一节我们初步介绍MindFusion.Diagramming框架 C#使用MindFusion.Diagramming框架绘制流程图(1):基础类型-CSDN博客 这里演示示例程序: 新建Windows窗体应用程序FlowDiagramDemo,将默认的Form1重命名为FormFlowDiagram. 右键FlowDiagramDemo管理NuGet程序包 输入MindFusio…

【物联网-ModBus-RTU

物联网-ModBus-RTU ■ 优秀博主链接■ ModBus-RTU介绍■(1)帧结构■(2)查询功能码 0x03■(3)修改单个寄存器功能码 0x06■(4)Modbus RTU 串口收发数据分析 ■ 优秀博主链接 Modbus …

Java应用10(客户端与服务器通信)

Java客户端与服务器通信 Java提供了多种方式来实现客户端与服务器之间的通信,下面我将介绍几种常见的方法: 1. 基于Socket的基本通信 服务器端代码 import java.io.*; import java.net.*;public class SimpleServer {public static void main(String…

Python_day47

作业:对比不同卷积层热图可视化的结果 一、不同卷积层的特征特性 卷积层类型特征类型特征抽象程度对输入的依赖程度低层卷积层(如第 1 - 3 层)边缘、纹理、颜色、简单形状等基础特征低高,直接与输入像素关联中层卷积层&#xff08…

如何在mac上安装podman

安装 Podman 在 macOS 上 在 macOS 上安装 Podman 需要使用 Podman 的桌面客户端工具 Podman Desktop 或通过 Homebrew 安装命令行工具。 使用 Homebrew 安装 Podman: (base) ninjamacninjamacdeMacBook-Air shell % brew install podman > Auto-updating Hom…

小黑一层层削苹果皮式大模型应用探索:langchain中智能体思考和执行工具的demo

引言 小黑黑通过探索langchain源码,设计了一个关于agent使用工具的一个简化版小demo(代码可以跑通),主要流程: 1.问题输入给大模型。 2.大模型进行思考,输出需要执行的action和相关思考信息。 3.通过代理&…

阿里云ACP云计算备考笔记 (4)——企业应用服务

目录 第一章 企业应用概览 第二章 云解析 1、云解析基本概念 2、域名管理流程 3、云解析记录类型 4、域名管理 ① 开启注册局安全锁 ② 域名赎回 第二章 内容分发网络CDN 1、CDN概念 2、使用CDN前后对比 3、使用CDN的优势 4、阿里云CDN的优势 5、配置网页性能优化…

ARM SMMUv3简介(一)

1.概述 SMMU(System Memory Management Unit,系统内存管理单元)是ARM架构中用于管理设备访问系统内存的硬件模块。SMMU和MMU的功能类似,都是将虚拟地址转换成物理地址,不同的是MMU转换的虚拟地址来自CPU,S…

hadoop集群datanode启动显示init failed,不能解析hostname

三个datanode集群,有一个总是起不起来。去查看log显示 Initialization failed for Block pool BP-1920852191-192.168.115.154-1749093939738 (Datanode Uuid 89d9df36-1c01-4f22-9905-517fee205a8e) service to node154/192.168.115.154:8020 Datanode denied com…

浏览器工作原理05 [#] 渲染流程(上):HTML、CSS和JavaScript是如何变成页面的

引用 浏览器工作原理与实践 一、提出问题 在上一篇文章中我们介绍了导航相关的流程,那导航被提交后又会怎么样呢?就进入了渲染阶段。这个阶段很重要,了解其相关流程能让你“看透”页面是如何工作的,有了这些知识,你可…

|从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面

🐑 |从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面 🐑 文章目录 🐑 |从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面 🐑♈前言♈♈调取Deepseek大模型♈♒准备工作♒♒调用API♒ ♈将模型嵌入到ui界面中♈♈…

pikachu靶场通关笔记20 SQL注入03-搜索型注入(GET)

目录 一、SQL注入 二、搜索型注入 三、源码分析 1、渗透思路1 2、渗透思路2 四、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入百分号单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取…

产品笔试专业名词梳理

目录 产品常识 四种常见广告形式 贴片广告 中插广告 信息流广告 横幅广告 BAT和TMD BAT TMD 付费渗透率 蓝海市场、红海市场 蓝海市场 红海市场 竞品研究 SWOT分析 SWOT分析的核心目的: SWOT分析的优点: SWOT分析的局限与注意事项&…

【前端】es6相关,柯里化

0. 严格模式 严格模式的概念从ES6引进。通过严格模式,可以在函数内部选择进行较为严格的全局或局部的错误条件检测。 MDN中严格模式的描述 严格模式通过抛出错误来消除了一些原有静默错误严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷:有时…

51单片机基础部分——矩阵按键检测

前言 上一节,我们说到了独立按键的检测以及使用,但是独立按键每一个按键都要对应一个IO口进行检测,在一些需要多按键的情况下,使用过多的独立按键会过多的占用单片机的IO资源,为了解决这个问题的出现,我们…

SpringBoot2.3.1集成Knife4j接口文档

首先要查看项目中pom文件里面有没有swagger和knife4j的依赖&#xff0c;如果有的话删除&#xff0c;加入以下依赖 <!-- swagger --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-spring-boot-starter</…

容器安全最佳实践:云原生环境下的零信任架构实施

&#x1f4cb; 目录 引言&#xff1a;容器安全的重要性零信任架构基础理论云原生环境的安全挑战容器安全威胁模型分析零信任架构在容器环境中的实施关键技术组件与工具安全策略与最佳实践监控与响应机制案例研究与实施路径未来发展趋势 引言 随着容器技术和云原生架构的快速…

[BIOS]VSCode zx-6000 编译问题

前提&#xff1a;Python 3.6.6及以上版本安装成功&#xff0c;Python 3.6.6路径加到了环境变量# DEVITS工具包准备好 问题&#xff1a;添加环境变量 1&#xff1a;出现环境变量错误&#xff0c;“py -3” is not installed or added to environment variables #先在C:\Windows里…

CICD实战(二)-----gitlab的安装与配置

1、安装gitlab所需要的依赖包与工具 sudo yum install wget net-tools sudo yum install curl policycoreutils openssh-server openssh-clients postfix -y 2、配置清华源 vim /etc/yum.repo.d/gitlab-ce.repo[gitlab-ce] namegitlab-ce baseurlhttp://mirrors.tuna.tsin…

[GitHub] 优秀开源项目

1 工具类 1.1 桌面猫咪互动 BongoCat