news 2026/4/22 20:06:49

C语言基础知识 -- BCD码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言基础知识 -- BCD码
// 压缩的BCD码 如 十进制123, 对应 0x0123voidLongByteToBCD1(UINT8 longByte,UINT8*a){UINT16 bcd;bcd=((longByte/100)<<8)+(((longByte%100)/10)<<4)+(longByte%10);*a=(UINT8)(bcd>>8);*(a+1)=(UINT8)bcd;}UINT16BCDToLongByte(UINT16 bcd){return((bcd>>8)*100+(((bcd%256)>>4)*10)+(bcd%256%16));}

BCD码的概念

BCD码是Binary-Coded Decimal的缩写,直译是二进制编码的十进制数,核心本质是用一组二进制数来表示单个十进制数字(0~9),是专门为解决「计算机二进制存储」和「人类十进制使用」的衔接问题设计的编码方式,也是嵌入式开发、数字电路、仪器仪表中最常用的编码之一(之前看到的函数,就是嵌入式里BCD码的典型应用)。

一、为什么需要BCD码?

计算机底层只能存储和运算二进制数,但人类日常使用十进制,二者直接转换会有问题:

  1. 普通二进制转十进制(如0b1010=10)是权值转换,适合数值计算,但如果是直接显示/传输十进制数字(如数码管、液晶屏、串口传数字),需要频繁做进制转换,效率低;
  2. 硬件外设(如数码管、BCD码计数器、实时时钟RTC)本身只识别BCD码,直接用BCD码存储数字,能跳过进制转换,直接对接硬件

简单说:BCD码不是为了计算机“计算”,而是为了计算机“和人类/硬件交互十进制数字”

二、BCD码的核心规则

最基础的BCD码是8421-BCD码(也是最常用的,无特殊说明时BCD码均指它),规则极其简单:

  1. 4位二进制数表示1位十进制数字(0~9);
  2. 4位二进制的权值依次是8、4、2、1(因此叫8421码),按普通二进制计算即可得到对应十进制数;
  3. 4位二进制的取值范围仅用00001001**,10101111(对应十进制10~15)是无效BCD码**,绝对不会使用。

三、基础BCD码编码表(0~9)

这是8421-BCD码的核心对应关系,记下来就能直接用,嵌入式开发中会频繁接触:

十进制数字4位8421-BCD码十六进制表示(方便书写)
000000x0
100010x1
200100x2
300110x3
401000x4
501010x5
601100x6
701110x7
810000x8
910010x9

关键提醒:4位BCD码**没有1015的对应值**,比如`0b1010`(0xA)不是合法的BCD码,在BCD码运算/存储中出现这个值,就是错误的(比如你之前的函数,输入最大255,拆分后十位、个位都是09,刚好符合BCD码规则)。

四、BCD码的两种常用形式(重点,和你之前的代码强相关)

计算机的基本存储单位是字节(8位),而BCD码基础单位是4位,因此衍生出非压缩BCD码压缩BCD码两种形式,其中压缩BCD码是你之前函数的核心,必须重点理解。

1. 非压缩BCD码(也叫无符号BCD码)
  • 规则1个字节(8位)存储1位十进制数字,其中低4位是有效BCD码(0000~1001),高4位补0
  • 特点:存储效率低,但处理简单,适合表示单个十进制数字位数少且需要单独操作的数字
  • 例子:十进制5→ 非压缩BCD码0000 0101(0x05);十进制90000 1001(0x09)。
2. 压缩BCD码(你之前代码的核心!)
  • 规则1个字节(8位)存储2位十进制数字,其中高4位表示十位的BCD码,低4位表示个位的BCD码
  • 特点:存储效率高,是嵌入式开发中表示**两位十进制数(00~99)**的标准方式,也是数码管、RTC时钟的常用格式;
  • 核心例子(和你之前的函数完全对应):
    十进制23→ 十位2(0010)+ 个位3(0011)→ 压缩BCD码0010 0011(0x23);
    十进制55→ 十位5(0101)+ 个位5(0101)→ 压缩BCD码0101 0101(0x55);
    十进制08→ 十位0(0000)+ 个位8(1000)→ 压缩BCD码0000 1000(0x08)。

五、多位十进制数的BCD码表示(结合你之前的函数)

你之前的函数处理的是0~255的三位十进制数,核心是把三位十进制数拆成「百位」+「十位+个位」,分别用「非压缩BCD码」+「压缩BCD码」存储,这是嵌入式中三位十进制数的标准BCD码表示方式,举两个核心例子,和函数逻辑完全一致:

例子1:十进制123(函数输入longByte=123)
  • 拆分:百位1、十位2、个位3
  • 百位1:用1个字节非压缩BCD码0000 0001(0x01);
  • 十位+个位23:用1个字节压缩BCD码0010 0011(0x23);
  • 最终BCD码存储:0x01+0x23(就是函数中a[0]=0x01a[1]=0x23的结果)。
例子2:十进制255(UINT8最大值,函数输入longByte=255)
  • 拆分:百位2、十位5、个位5
  • 百位2:非压缩BCD码0000 0010(0x02);
  • 十位+个位55:压缩BCD码0101 0101(0x55);
  • 最终BCD码存储:0x02+0x55(和之前函数的计算结果完全一致)。
例子3:十进制5(个位数,函数输入longByte=5)
  • 拆分:百位0、十位0、个位5
  • 百位0:非压缩BCD码0000 0000(0x00);
  • 十位+个位05:压缩BCD码0000 0101(0x05);
  • 最终BCD码存储:0x00+0x05(函数的输出结果)。

六、BCD码和普通二进制的核心区别(关键!避免混淆)

很多新手会把BCD码和普通二进制搞混,这里用同一个数值做对比,一眼就能看清差异:

十进制数普通二进制(8位)压缩BCD码(8位)本质区别
230001 0111(0x17)0010 0011(0x23)普通二进制是权值计算结果,BCD码是十进制数字的二进制编码拼接

简单说:

  • 普通二进制:23是通过16+4+2+1计算出来的,二进制和十进制是运算关系
  • BCD码:23是把2的BCD码(0010)和3的BCD码(0011)直接拼起来,二进制和十进制是编码拼接关系

七、BCD码的典型应用场景(你会用到的)

BCD码几乎是嵌入式开发的标配,尤其是和「数字显示/硬件交互」相关的场景:

  1. 数码管/液晶屏显示:直接用BCD码驱动,无需进制转换;
  2. 实时时钟(RTC):芯片内部的年、月、日、时、分、秒全部用压缩BCD码存储;
  3. 仪器仪表/串口通信:传输十进制数字时,用BCD码能避免传输错误,解析更简单;
  4. 你之前看到的LongByteToBCD1函数:嵌入式中把传感器/寄存器的8位数值转成BCD码,用于后续显示/传输。

总结(BCD码核心要点)

  1. BCD码(8421):**4位二进制表示1位十进制(09)**,10101111是无效码;
  2. 两种形式:非压缩BCD(1字节存1位,高4位补0)、压缩BCD(1字节存2位,高4位十位,低4位个位);
  3. 核心用途:解决二进制存储和十进制交互的衔接问题,适合嵌入式硬件/显示场景;
  4. 和普通二进制的区别:BCD码是编码拼接,普通二进制是权值运算
  5. 你之前的函数:把0~255的三位十进制数,拆成「百位(非压缩BCD)+ 十位个位(压缩BCD)」,存入两个连续字节。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 7:57:33

分布式存储数据恢复解析:以Ceph文件系统为例

在当今大数据时代&#xff0c;数据存储和管理已成为企业IT架构中的关键环节。分布式存储系统因其高可用性、高扩展性、低成本等优势&#xff0c;逐渐成为企业数据存储的首选。Ceph作为一款开源的分布式存储系统&#xff0c;受到了越来越多企业和单位的关注和采用。然而&#xf…

作者头像 李华
网站建设 2026/4/22 19:37:39

实战 | 高性能 AI 机器人 Clawdbot 容器化部署指南 (Docker + Python)

前言 在 AIGC 爆发的今天&#xff0c;拥有一款私有化、可定制的 AI 机器人是许多开发者和企业的需求。Clawdbot 是一款轻量级、响应速度极快的 AI 对话机器人后端&#xff08;基于 Python/FastAPI 构建&#xff0c;支持 Claude 3.5/GPT-4o 模型&#xff09;。它具备上下文记忆…

作者头像 李华
网站建设 2026/4/23 13:19:16

14. 字符串

1.字符串字面量 2.C 风格字符串&#xff08;基于字符数组的字符串&#xff09; 3.C 标准库 string 类 4.字符串字面量与 std::string 的转换 1.字符串字面量 字符串字面量是C中最基础的字符串形式, 你可以把它理解为直接用双引号""包裹的字符序列比如"hello…

作者头像 李华
网站建设 2026/4/18 8:10:19

成都周边千年古镇天花板!黄龙溪的美藏在流水与古巷里

黄龙溪古镇位于四川省成都市双流区的锦江与鹿溪河交汇处&#xff0c;是一座拥有超过一千七百年历史的川西水乡古镇。其得名源于自然景观&#xff1a;源自都江堰的锦江水色清澈&#xff0c;而发源于龙泉山的鹿溪河水色泛黄&#xff0c;两河交汇时&#xff0c;黄水汇入清江的景象…

作者头像 李华