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

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

 

目录

  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

相关文章:

  • SpringBoot十二、SpringBoot系列web篇之过滤器Filte详解
  • 如何在c/c++中定义和使用宏
  • 基于Springboot的宠物领养系统
  • CKA考试知识点分享(2)---ingress
  • ARM SMMUv3简介(一)
  • 主流大语言模型安全性测试(三):阿拉伯语越狱提示词下的表现与分析
  • 部门档案在不同系统中的差异及整合思路
  • FTP文件服务的搭建----详解
  • [Go]context上下文--使用要点--源码分析--Go核心--并发编程
  • IEC 61347-1:2015 灯控制装置安全通用要求详解
  • win32相关(IAT HOOK)
  • STM32什么是寄存器
  • HTML 面试题错题总结与解析
  • 锁的艺术:深入浅出讲解乐观锁与悲观锁
  • python asyncio的作用
  • 安卓基础(aar)
  • FastAPI安全机制:从OAuth2到JWT的魔法通关秘籍
  • PySide6 GUI 学习笔记——常用类及控件使用方法(单行文本控件QLineEdit)
  • 冰箱智能化升级方案:WT3000A离在线AI语音模组赋能AI在线对话功能
  • 10.Linux进程信号
  • 维护网站费用/深圳宝安seo外包
  • 中石化第四建设有限公司网站/天津网站优化公司
  • 南充网站建设/qq群推广网站免费
  • 设计室内效果图设计/微博关键词排名优化
  • 周口网站建设zkweb/网络安全有名的培训学校
  • 域名停靠网站下载大全免费/推广软文平台