BCD码:8421 表、转换方法、加法修正与实例

2026/08/16

BCD码是一种把每个十进制数字分别编码为四位二进制的表示方法。它的英文全称是 Binary-Coded Decimal,即“二进制编码的十进制数”。例如,十进制 59 会编码为 0101 1001:前四位表示 5,后四位表示 9。

BCD 与把完整数值转换为二进制不同。它有意保留十进制数位的边界,因此适合计算器、数字显示、时钟寄存器和固定小数位记录。下面通过完整 8421 表、转换实例和加法修正说明其工作方式。

8421 BCD码对照表

最常见的 BCD 也称 8421码,因为四个位从高到低的权值分别是 8、4、2、1。四位共有 16 种组合,但标准 BCD 只用其中十种表示十进制数字 0 到 9。

十进制数字BCD码8 位补零形式
0000000000000
1000100000001
2001000000010
3001100000011
4010000000100
5010100000101
6011000000110
7011100000111
8100000001000
9100100001001

10101111 不能表示标准 8421 BCD 中的十进制数字。某些格式会把这些组合用作正负号或特殊标记,但必须由具体协议另行定义。

表中的 8 位列只是展示前导零。BCD 的核心单位是每个十进制数字一个四位组。如果需要查阅普通数值的多进制表示,可以使用二进制表

BCD码与普通二进制的区别

理解 BCD 的关键是“逐个十进制数字编码”。仍以十进制 59 为例:

十进制数字:       5       9
BCD分组:        0101    1001
BCD结果:        01011001

普通二进制59:   00111011

如果把 01011001 当作普通二进制整数,它等于十进制 89,而不是 59。只有在解码器知道数据采用 BCD码时,这串位才表示十进制 59。位串本身没有固定语义,数据格式决定它的解释方式。

普通二进制使用空间更高效,因为全部位共同表示一个二进制数值。BCD 每个十进制数字固定占四位,并在每组中空出六种状态。换来的好处是十进制数字易于拆分、显示、校验和按十进制规则舍入。

可以先阅读二进制数制指南复习位值,再用十进制转二进制工具比较普通二进制结果与本文的逐位 BCD 分组。

十进制如何转换为BCD码

转换时不要一次处理整个数值,而要按十进制数字逐个编码:

  1. 保留原来的十进制数字边界。
  2. 在 8421 表中查出每个数字的四位代码。
  3. 按原有顺序连接各组。
  4. 若前导零、符号或小数位具有业务含义,应单独保留相关信息。

示例:把 407 转换为 BCD

4 -> 0100
0 -> 0000
7 -> 0111

407 -> 0100 0000 0111

中间的 0000 不能删除,因为它代表十位上的 0。删掉这一组后,BCD 数据就会变成 47。

示例:把 98.25 转换为 BCD

9 -> 1001
8 -> 1000
2 -> 0010
5 -> 0101

98.25 -> 1001 1000 . 0010 0101

小数点不是四位数字代码的一部分。存储格式必须另外记录小数点位置,或者约定固定比例。例如,金融字段可以规定最后两组始终表示分。

如何把BCD码解码为十进制

解码步骤与编码相反:从格式规定的边界开始,把位串每四位分成一组;检查每组是否在 00001001 范围内;再把每组翻译为一个十进制数字。

解码 0011 0110 1001

0011 -> 3
0110 -> 6
1001 -> 9

结果:369

不要把完整位串送入普通的二进制转十进制工具,否则它会被当作一个二进制整数。如果某一组是 1100,标准 8421 BCD 解码器应报告无效数字,而不是把它解释为 12。

压缩 BCD 与非压缩 BCD

压缩 BCD在一个字节的高、低半字节中各放一个十进制数字:

十进制27 -> 0010 0111
             2    7

这是较紧凑的常见形式。四个十进制数字需要 16 位,而能覆盖 0 到 9999 的普通无符号二进制只需要 14 位。

非压缩 BCD通常为每个数字分配一个完整字节,把代码放在低四位:

十进制27 -> 00000010 00000111

它占用更多空间,但对于一次处理一个显示位的控制器、旧式处理器或协议可能更方便。有些格式把高四位用作区域码、符号或其他元数据,所以解码前必须查看规范。

四位也称为一个半字节。由于一个 BCD 数字恰好占一个半字节,十六进制视图很适合检查压缩数据。文件转十六进制工具可以显示原始字节,但仅凭十六进制外观无法判断一个半字节究竟是 BCD、普通整数还是字符编码。

BCD加法为什么需要加6修正

BCD 加法先按普通二进制相加,但每个十进制位的结果可能需要修正。当四位和大于 1001,或该四位组产生了向外进位时,应给该位加上 0110(十进制 6),从而跳过六种无效状态并形成正确的十进制进位。

示例:计算 7 + 5

先直接相加:

  0111   (7)
+ 0101   (5)
------
  1100   (不是有效BCD数字)

因为 1100 大于 1001,加上修正值 0110

  1100
+ 0110
------
1 0010

进位 1 成为十位,低四位 0010 表示个位 2。因此最终结果为 0001 0010,即十进制 12。

四位有 16 种状态,BCD 数字只占 10 种,9 后面正好留下 6 种无效状态。加 6 能把无效的四位和推进下一十进制位,并让低四位落回正确数字。多位 BCD 加法需要从低位开始逐组检查,将十进制进位传给下一组。

逻辑门指南介绍了硬件如何组合检测与修正电路;二进制加法工具展示的是普通二进制进位,不会自动执行 BCD 的加 6 修正。

符号、小数点与前导零

标准 8421 BCD 只规定数字 0 到 9,不是一套完整的有符号数文件格式。实际协议还必须说明:

  • 正负号放在独立位、独立字节还是最后一个半字节中?
  • 小数点显式存储,还是通过固定比例隐含?
  • 前导零是否用于保持显示宽度或记录长度?
  • 每个字节先放高位数字还是低位数字?
  • 无效数字组合能否用作符号、空值或结束标记?

例如,某种压缩十进制格式可能把最后一个 1100 定义为正号。这个约定并不通用;若没有格式说明,不能把 1100 当作普通 BCD 数字。

前导零在显示与记录中可能有实际意义。六位仪表读数 000127 若要保持固定宽度,就需要六个 BCD 数字组,即使它在数学上与 127 相等。

BCD码的实际用途

BCD 在需要贴近十进制输入、输出或记录规则的系统中仍然有价值:

  • 计算器与数字显示器: 数字组可以直接映射到每个显示位置。
  • 金融与商业数据: 固定小数位和十进制数字便于执行明确的舍入规则。
  • 实时时钟: 一些芯片用 BCD 寄存器提供秒、分、日期和年份。
  • 数字仪表与计数器: 采集结果通常需要按十进制位显示。
  • 旧式业务系统: 压缩十进制格式可保存固定宽度记录。
  • 嵌入式设备: 硬件寄存器和通信协议可能直接交换十进制数字组。

BCD 本身并不会自动保证金融计算正确。精度仍取决于字段宽度、比例、舍入规则、溢出处理和实现的运算。它只让十进制表示方式更明确。

优点与缺点

优点

  • 无需反复除以 10,就能提取并显示各十进制数字。
  • 比例明确时,可精确保存 0.1 这样的十进制数字结构。
  • 十进制舍入规则通常更容易实现和审计。
  • 每个四位组都能独立检查是否位于 0000-1001
  • 前导零和固定数字宽度可以原样保留。

缺点

  • 对大多数数值范围而言,比普通二进制占用更多位。
  • 每个半字节有六种组合不能作为数字使用。
  • 算术需要额外的十进制修正,通常不如原生二进制高效。
  • 压缩、非压缩、带符号和区域十进制存在多种约定。
  • 缺少格式元数据时,原始位串很容易被误读。

大量计算通常更适合普通二进制;需要十进制显示、精确固定比例和人类可核对记录时,BCD 可以减少转换与表示问题。

BCD、ASCII 与十六进制不是一回事

BCD 用四位数值表示一个十进制数字;ASCII 表示写出该数字所使用的字符;十六进制则是一种显示位模式的记数法。

以数字 7 为例:

表示方式位或数值
BCD数字 70111
ASCII字符 7001101110x37
普通二进制数值 7111

压缩 BCD 0010 0111 表示十进制 27,而 ASCII 文本 27 使用两个字节 00110010 00110111ASCII码表展示了文本数字为何采用不同代码。十六进制查看器可能把该 BCD 字节显示为 0x27,但显示写法不会改变底层数据格式。

常见错误

  • 把整个 BCD 位串当作一个普通二进制整数转换。
  • 1010-1111 当成标准 BCD 的有效数字。
  • 删除数值中间代表 0 的 0000 组。
  • 未查看格式规范就猜测小数点、符号或半字节顺序。
  • 混淆十进制数字的 BCD 代码与对应字符的 ASCII 代码。
  • BCD 加法结果大于 9 后,没有执行加 6 修正。

常见问题

BCD码是什么意思?

BCD码表示把十进制数字 0 到 9 分别编码成四位二进制。标准 8421 形式从 0000 表示 0,到 1001 表示 9。

为什么称为8421码?

四个位的权值依次为 8、4、2、1。把值为 1 的位对应权值相加,就得到该组代表的十进制数字。例如 0101 的有效权值是 4 和 1,因此表示 5。

BCD与十六进制相同吗?

不同。十六进制使用全部 16 种四位组合表示 0 到 F,标准 BCD 只用其中十种表示 0 到 9。十六进制可以显示 BCD 字节,但不决定其语义。

为什么有六种无效组合?

一个半字节有 16 种状态,而十进制只有十个数字,所以从 10101111 的六种模式在标准 8421 BCD 中没有数字含义。

一个BCD数需要多少位?

压缩 BCD 中每个十进制数字需要四位。六位无符号十进制值需要 24 位,此外还可能需要保存符号、比例或其他元数据。

现在还会使用BCD吗?

会。它仍用于数字显示、实时时钟芯片、仪表、嵌入式接口、计算器和旧式压缩十进制业务格式。一般计算则更多使用普通二进制。

总结

BCD码通过为每个十进制数字分配一个四位 8421 代码来保留十进制结构。它让显示、固定比例和十进制数字校验更直接,但会占用更多空间,并在算术中需要加 6 修正。处理原始数据时,应始终按数字分组、验证每个半字节,并从格式规范确认符号、小数点、顺序和特殊代码。

管理员

管理员