news 2026/3/1 1:51:35

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/2/28 19:36:20

计算机视觉——Opencv(直方图均衡化)

直方图均衡化&#xff1a;是一种图像增强技术&#xff0c;它可以通过增加图像的对比度和亮度来改善图像的质量。实现方法&#xff1a;通过将图像的像素值分布均匀化来实现这一目标。在Python OpenCV中&#xff0c;可以使用cv2.equalizeHist()函数来实现直方图均衡化。一、导入相…

作者头像 李华
网站建设 2026/2/28 7:49:50

学术突围利器 | paperzz 开题报告 | 硕士研究生的开题救星

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 paperzz - 开题报告https://www.paperzz.cc/proposalhttps://www.paperzz.cc/proposal 凌晨两点的教研室里&#xff0c;计算机专业硕士小张盯着屏幕上被导师打回的第三版开题报告&#xff0c;红色批注像针…

作者头像 李华
网站建设 2026/2/27 15:16:51

建议收藏:AI Agent全面解析:从零开始掌握大模型智能应用开发

文章深入探讨了AI Agent的概念、架构与实现&#xff0c;详细解析了模型、工具和编排层三大核心组件。介绍了Agent通过ReAct、Chain-of-Thought等推理技术实现迭代处理&#xff0c;以及扩展、函数和数据存储等工具如何连接外部世界。文章还提供了增强模型效果的各种策略和开发实…

作者头像 李华
网站建设 2026/2/28 23:47:02

识别大模型撒谎:清华首创可解释性大模型幻觉检测

我们已经习惯利用大语言模型处理海量信息&#xff0c;依靠检索增强生成&#xff08;RAG&#xff09;等技术来获取基于上下文的连贯回答。但模型常常会生成与给定上下文不一致或完全无关的内容。这种现象被称为忠实度幻觉。对于追求精准的实际应用来说&#xff0c;这是致命的。如…

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

调试小技巧 - ArkWeb 调试 H5 页面

前提条件 需要开启 网页调试setWebDebuggingAccess() aboutToAppear(): void { // 启动网页调试功能 webview.WebviewController.setWebDebuggingAccess(true); // API20 支持 无线网页调试 // webview.WebviewController.setWebDebuggingAccess(true, 8888); // 8888 为…

作者头像 李华
网站建设 2026/2/27 10:52:51

基于PLC的电动车无刷直流电机控制

基于PLC的电动车无刷直流电机控制系统设计与实现 第一章 绪论 无刷直流电机&#xff08;BLDC&#xff09;凭借效率高、寿命长、调速性能优的特性&#xff0c;成为电动车动力系统的核心部件。传统电动车电机多采用专用驱动模块控制&#xff0c;存在参数调节不灵活、故障诊断能力…

作者头像 李华