当前位置: 首页 > news >正文

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)」,存入两个连续字节。
http://www.jsqmd.com/news/333190/

相关文章:

  • 年底回家别让孝心打折,分期乐额度这样用,体面又暖心 - 团团收购物卡回收
  • 计算机毕业设计之springboot基于java实现的健身房操课预约系统
  • 2026年 工业清洗剂厂家推荐排行榜,金属清洗剂,机械零件清洗剂,水基/溶剂型清洗剂,航空发动机清洗剂源头实力品牌深度解析 - 品牌企业推荐师(官方)
  • 基于SpringBoot的微信小程序民宿预约管理系统毕业论文+PPT(附源代码+演示视频)
  • 2026年山东营销策划公司推荐:多场景实战评测,直击增长乏力与预算有限痛点 - 品牌推荐
  • Windows11优化
  • 学习干货_从网线到攻防,一起学习网络基础、安全原理与密码学知
  • 齐齐哈尔市英语雅思培训辅导机构推荐;2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025
  • 2026年山东营销策划公司专项甄选报告:头部优质机构全景梳理及专业选型指南 - 品牌推荐
  • 2026冲刺用!8个AI论文工具:继续教育毕业论文写作全维度测评
  • 2026年触屏溶出仪厂家深度测评:如何选择高口碑、高性价比之选? - 品牌推荐大师
  • 安防生意新蓝海:无需研发,用我们的“黑科技”底座,打造您自己的AI品牌
  • 从此告别拖延 9个AI论文软件深度测评:自考毕业论文+开题报告写作必备工具
  • 男士洗面奶排行榜什么牌子好,口碑最高的男士洗面奶? - 博客万
  • 收藏!2026年风口已定:房价下跌潮下,程序员/小白躺赢的大模型赛道
  • 计算机视觉——Opencv(图像直方图与掩膜)
  • 收藏!2026年往届生逆袭指南:从普通开发到年薪60W+,大模型链路开发真香
  • InVivoMAb Anti-Mouse CD4:与同类型产品相比,成本效益显著
  • “华为杯”研究生数学建模竞赛2015年-【华为杯】D题:面向节能的单/多列车优化决策控制
  • 硕士开题不再愁:paperzz 开题报告智能工具如何拯救你的学术焦虑
  • InVivoMAb Anti-Mouse CD4:从基础免疫研究到转化医学应用的科研利器
  • <span class=“js_title_inner“>易买工品冲刺港股:9个月营收5.5亿,亏2.9亿 启明与高榕是股东</span>
  • 2026年广东省考面试班推荐:为什么众多考生选择登科7月? - 华Sir1
  • 汽车EDR存储需求暴增,英飞凌推出新型 F-RAM 存储器
  • 【保姆级教程】Python手搓“贾维斯”:一行代码打通GPT-5.2/Sora 2/Veo 3,拒绝API焦虑,这波赢麻了
  • <span class=“js_title_inner“>康诺生物冲刺港股:9个月营收2.4亿 期内利润5341万</span>
  • 子传父的核心应用场景(vue3) - 教程
  • 策略模式+工厂模式实现审批流(面试问答版)
  • 告别学术入门恐慌:paperzz 开题报告搭建硕士科研的智能脚手架
  • 网络安全/黑客入门教程【详细版】从零基础入门到精通,看完这一篇就够了