news 2026/4/4 10:25:04

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/3/29 12:19:23

【保姆级教程】Python手搓“贾维斯”:一行代码打通GPT-5.2/Sora 2/Veo 3,拒绝API焦虑,这波赢麻了

摘要&#xff1a; 本文将带你从零开始 利用Python构建一个企业级的多模态AI中台 深度解析如何绕过复杂的网络环境和风控限制 通过向量引擎实现对GPT-5.2、Sora 2、Veo 3等顶级模型的统一调度 内含完整代码实现、架构分析及避坑指南 建议收藏后阅读 一、 程序员的至暗时刻与黎…

作者头像 李华
网站建设 2026/4/1 22:16:03

当所有流量都“上锁”:TLS/SSL解密为何是安全团队的“必备钥匙”?

为了防止敏感信息在传输过程中遭受恶意攻击者的窃取或修改&#xff0c;目前大部分的网络流量都是加密的。然而很多网络安全设备无法解密HTTPS流量或者需要占用大量计算资源&#xff0c;造成性能下降&#xff0c;这给恶意行为者提供了一席藏身之处以发起网络攻击。 TLS/SSL解密…

作者头像 李华
网站建设 2026/3/31 2:19:46

LangChain 从入门到实战 -六大组件之Agent_langchain agent_langchain的agent,零基础入门到精通,收藏这篇就够了

一、代理原理 代理的核心思想是使用语言模型来选择一系列操作。在链中,一系列操作是硬编码的。在代理中,语言模型被用作推理引擎来确定要采取哪些操作以及按什么顺序。 需要了解的重要概念: 需要了解的重要概念: AgentAction:表示代理应采取的操作。它有一个 tool 属性(要调…

作者头像 李华
网站建设 2026/3/31 21:01:32

Substance P (7-11) (Penta-Substance P) ;FFGLM-NH₂

一、基础信息 英文名称&#xff1a;Substance P (7-11) (Penta-Substance P)三字母序列&#xff1a;Phe-Phe-Gly-Leu-Met-NH₂单字母序列&#xff1a;FFGLM-NH₂精确分子量&#xff1a;612.79 Da等电点&#xff08;pI&#xff09;&#xff1a;5.5~6.0&#xff0c;弱酸性分子式…

作者头像 李华