数字电路码制详解:从原码到BCD码的完整指南
前言
在数字电路中,我们不仅要解决"用什么进制"的问题,还要解决"如何编码"的问题。
进制解决的是计数规则 (逢几进一),而码制解决的是表示规则(用哪些二进制位表示什么含义)。
本文将系统讲解数字电路中常用的各种码制,包括原码、反码、补码、BCD码、格雷码等,帮助你彻底搞清楚这些概念。
目录
码制与进制的区别
核心区分
| 概念 | 解决的问题 | 例子 |
|---|---|---|
| 进制 | 逢几进一?计数规则是什么? | 二进制、八进制、十进制、十六进制 |
| 码制 | 用什么编码表示?含义是什么? | 原码、反码、补码、BCD码、格雷码 |
举例说明
同样是二进制数 1010:
- 作为无符号二进制数:表示十进制 10
- 作为4位原码:表示十进制 -2(最高位为符号位)
- 作为8421BCD码:表示十进制 10
- 作为格雷码:表示十进制 11
同一个二进制位组合,不同码制下含义完全不同!
机器数与真值
定义
| 术语 | 定义 | 例子 |
|---|---|---|
| 真值 | 实际的数值(带正负号) | +5、-3、+127 |
| 机器数 | 计算机中存储的二进制表示 | 0101、1101、01111111 |
关键点
- 机器数是二进制形式 ,真值是实际含义
- 机器数的最高位 通常作为符号位 :
- 0 表示正数
- 1 表示负数
- 其余位表示数值位
示例(8位机器数)
| 机器数 | 符号位 | 数值位 | 真值(原码解释) |
|---|---|---|---|
| 0000 0101 | 0 | 000 0101 | +5 |
| 1000 0101 | 1 | 000 0101 | -5 |
| 0111 1111 | 0 | 111 1111 | +127 |
| 1111 1111 | 1 | 111 1111 | -127 |
原码、反码、补码
这是计算机中表示有符号整数的三种编码方式。
一、原码(Sign-Magnitude)
定义:符号位 + 绝对值的二进制表示
规则:
- 正数:符号位为0,数值位为该数的二进制
- 负数:符号位为1,数值位为该数绝对值的二进制
示例(8位):
| 真值 | 原码 |
|---|---|
| +5 | 0000 0101 |
| -5 | 1000 0101 |
| +0 | 0000 0000 |
| -0 | 1000 0000 |
原码的问题:
- 零有两种表示:+0 和 -0
- 运算复杂:加减法需要判断符号,硬件实现麻烦
二、反码(Ones' Complement)
定义:正数同原码,负数为原码数值位按位取反
规则:
- 正数:与原码相同
- 负数:符号位为1,数值位为原码数值位按位取反
示例(8位):
| 真值 | 原码 | 反码 |
|---|---|---|
| +5 | 0000 0101 | 0000 0101 |
| -5 | 1000 0101 | 1111 1010 |
| +0 | 0000 0000 | 0000 0000 |
| -0 | 1000 0000 | 1111 1111 |
反码的问题:
- 零仍然有两种表示
- 运算时需要循环进位
三、补码(Two's Complement)⭐ 最重要
定义:正数同原码,负数为反码加1
规则:
- 正数:与原码相同
- 负数:反码 + 1,或等价地,原码数值位取反后加1
示例(8位):
| 真值 | 原码 | 反码 | 补码 |
|---|---|---|---|
| +5 | 0000 0101 | 0000 0101 | 0000 0101 |
| -5 | 1000 0101 | 1111 1010 | 1111 1011 |
| +0 | 0000 0000 | 0000 0000 | 0000 0000 |
| -0 | 1000 0000 | 1111 1111 | 0000 0000 |
| -128 | --- | --- | 1000 0000 |
补码的优点:
- 零只有一种表示
- 加减法统一:减法变成加负数
- 符号位参与运算:不需要单独处理
补码的快速求法
负数补码的简便求法:
从右向左,第一个1及其右边保持不变,左边按位取反。
示例:求 -5 的8位补码
+5 的原码:0000 0101
从右向左找第一个1:0000 0101
↑
该位及右边不变,左边取反:1111 1011
为什么计算机用补码
核心原因
- 统一加减法运算
减法可以转化为加法:
5 - 3 = 5 + (-3)
在补码系统中:
0000 0101 (+5)
+ 1111 1101 (-3)
-----------
0000 0010 (+2) ← 结果正确!
- 零的唯一表示
补码中,零只有一种表示(0000 0000),避免了原码和反码的"正零负零"问题。
- 扩大表示范围
n位补码的表示范围:
- 原码/反码:-(2^(n-1) - 1) 到 +(2^(n-1) - 1)
- 补码:-2^(n-1) 到 +(2^(n-1) - 1)
例如8位:
- 原码/反码:-127 到 +127
- 衡码:-128 到 +127(多表示一个 -128)
BCD码(二-十进制编码)
什么是BCD码?
BCD码用4位二进制 表示1位十进制数字。
常用BCD码类型
1. 8421BCD码(最常用)
| 十进制 | 8421BCD | 权值解释 |
|---|---|---|
| 0 | 0000 | 0×8+0×4+0×2+0×1 |
| 1 | 0001 | 0×8+0×4+0×2+1×1 |
| 2 | 0010 | 0×8+0×4+1×2+0×1 |
| 3 | 0011 | 0×8+0×4+1×2+1×1 |
| 4 | 0100 | 0×8+1×4+0×2+0×1 |
| 5 | 0101 | 0×8+1×4+0×2+1×1 |
| 6 | 0110 | 0×8+1×4+1×2+0×1 |
| 7 | 0111 | 0×8+1×4+1×2+1×1 |
| 8 | 1000 | 1×8+0×4+0×2+0×1 |
| 9 | 1001 | 1×8+0×4+0×2+1×1 |
注意 :1010~1111 这6种组合在8421BCD中是非法码!
2. 5421BCD码
| 十进制 | 5421BCD |
|---|---|
| 0 | 0000 |
| 1 | 0001 |
| 2 | 0010 |
| 3 | 0011 |
| 4 | 0100 |
| 5 | 1000 |
| 6 | 1001 |
| 7 | 1010 |
| 8 | 1011 |
| 9 | 1100 |
3. 2421BCD码
| 十进制 | 2421BCD |
|---|---|
| 0 | 0000 |
| 1 | 0001 |
| 2 | 0010 |
| 3 | 0011 |
| 4 | 0100 |
| 5 | 1011 |
| 6 | 1100 |
| 7 | 1101 |
| 8 | 1110 |
| 9 | 1111 |
BCD码的应用
- 数字显示(数码管)
- 金融计算(避免浮点误差)
- 十进制运算电路
格雷码
什么是格雷码?
格雷码是一种相邻两个码只有一位不同的编码方式。
4位格雷码表
| 十进制 | 二进制 | 格雷码 |
|---|---|---|
| 0 | 0000 | 0000 |
| 1 | 0001 | 0001 |
| 2 | 0010 | 0011 |
| 3 | 0011 | 0010 |
| 4 | 0100 | 0110 |
| 5 | 0101 | 0111 |
| 6 | 0110 | 0101 |
| 7 | 0111 | 0100 |
| 8 | 1000 | 1100 |
| 9 | 1001 | 1101 |
| 10 | 1010 | 1111 |
| 11 | 1011 | 1110 |
| 12 | 1100 | 1010 |
| 13 | 1101 | 1011 |
| 14 | 1110 | 1001 |
| 15 | 1111 | 1000 |
格雷码的特点
- 相邻性:任意相邻两个格雷码只有一位不同
- 循环性:首尾格雷码也只有一位不同
- 反射性:具有镜像对称结构
二进制转格雷码
G i = B i ⊕ B i + 1 G_i = B_i \oplus B_{i+1} Gi=Bi⊕Bi+1
即:格雷码的第i位 = 二进制码的第i位 异或 二进制码的第i+1位
示例:二进制 1011 → 格雷码?
B3 B2 B1 B0 = 1 0 1 1
G3 G2 G1 G0 = 1⊕0 0⊕1 1⊕1 1
= 1 1 0 1
答案:1101
格雷码的应用
- 编码器(避免跳变误差)
- 位置传感器
- 模数转换
奇偶校验码
原理
在数据位后增加一位校验位,使整个码中"1"的个数为奇数或偶数。
奇校验 vs 偶校验
| 类型 | 规则 |
|---|---|
| 奇校验 | 数据位 + 校验位 中"1"的个数为奇数 |
| 偶校验 | 数据位 + 校验位 中"1"的个数为偶数 |
示例
| 数据 | 1的个数 | 奇校验位 | 偶校验位 |
|---|---|---|---|
| 1010 | 2(偶) | 1 | 0 |
| 1011 | 3(奇) | 0 | 1 |
| 1100 | 2(偶) | 1 | 0 |
局限性
- 只能检测奇数个错误
- 不能纠错
- 不能检测偶数个错误
码制对照表
常用编码对照(十进制 0~9)
| 十进制 | 二进制 | 8421BCD | 格雷码 | 奇校验码 |
|---|---|---|---|---|
| 0 | 0000 | 0000 | 0000 | 00001 |
| 1 | 0001 | 0001 | 0001 | 00010 |
| 2 | 0010 | 0010 | 0011 | 00101 |
| 3 | 0011 | 0011 | 0010 | 00110 |
| 4 | 0100 | 0100 | 0110 | 01001 |
| 5 | 0101 | 0101 | 0111 | 01010 |
| 6 | 0110 | 0110 | 0101 | 01100 |
| 7 | 0111 | 0111 | 0100 | 01111 |
| 8 | 1000 | 1000 | 1100 | 10001 |
| 9 | 1001 | 1001 | 1101 | 10010 |
典型例题
例题一:求补码
求十进制数 -37 的8位补码。
【解】
第一步:求 +37 的原码
+37 = 32 + 4 + 1 = 0010 0101
第二步:求反码(数值位取反)
0010 0101 → 1101 1010
第三步:求补码(反码 + 1)
1101 1010 + 1 = 1101 1011
【答案】:1101 1011
例题二:补码转真值
已知8位补码为 1110 0110,求其真值。
【解】
第一步:判断符号位
最高位为1,是负数
第二步:求原码
补码 → 反码(减1):1110 0110 - 1 = 1110 0101
反码 → 原码(数值位取反):1110 0101 → 1001 1010
第三步:求真值
原码数值位:001 1010 = 32 + 8 + 2 = 26
符号位为1,所以真值为 -26
【答案】:-26
例题三:8421BCD码转换
将十进制数 59 转换为8421BCD码。
【解】
5 → 0101
9 → 1001
【答案】:0101 1001
总结与记忆口诀
核心概念速记
| 码制 | 核心特点 |
|---|---|
| 原码 | 符号位 + 绝对值,零有两种表示 |
| 反码 | 正同原,负取反,零有两种表示 |
| 补码 | 正同原,负取反加一,零唯一,计算机必用 |
| BCD码 | 4位二进制表示1位十进制 |
| 格雷码 | 相邻只有一位不同 |
| 奇偶校验 | 增加1位使"1"的个数为奇/偶 |
补码求法口诀
正数补码同原码,负数反码加个一
快速求法看右边,第一个1左边翻
BCD码口诀
8421权值要记牢,四位二进表十进
1010以后非法码,只有零到九有效
格雷码口诀
相邻只变一位数,二进异或得格雷