欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 计算机组成与体系结构:补码数制二(Complementary Number Systems)

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

2025/6/8 15:36:01 来源:https://blog.csdn.net/2402_88047672/article/details/148501187  浏览:    关键词:计算机组成与体系结构:补码数制二(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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词