news 2026/5/1 3:18:20

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/23 20:43:56

计算机毕业设计之jsp高校实践课流程管理系统的设计与实现

高校实践课流程管理系统是学校中重要的一环&#xff0c;高校实践课流程管理是教师、学生获取信息的主要渠道。于是经过考虑之后决定开发基于JSP技术设计与实现了一款简洁、轻便的高校实践课流程管理系统。本系统解决了课程任务的主要问题&#xff0c;包括以下多个功能模块&…

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

计算机视觉——Opencv(图像直方图与掩膜)

图像直方图 直方图&#xff1a; 是图像中像素强度分布的图形表达方式。 直方图的作用&#xff1a; 例如视频中&#xff0c;通过标记帧和帧之间显著的边缘和颜色的统计变化&#xff0c;来检测视频中场景的变换。 灰度值在0 - 255范围之间总共 256 个值&#xff0c;可以将我们…

作者头像 李华
网站建设 2026/4/20 1:07:26

数控加工试切成本直降30%!国产数控编程仿真技术真牛

干数控加工这行快8年了&#xff0c;每次在机床上直接试切&#xff0c;我心都悬到嗓子眼。谁不是挣点辛苦钱&#xff0c;哪经得起撞刀、损活的折腾&#xff1f;上次试切一个复杂零件&#xff0c;就因为刀路没算准&#xff0c;不仅废了一根两百多的坯料&#xff0c;机床主轴检修又…

作者头像 李华
网站建设 2026/4/30 11:04:44

学霸同款10个降AI率平台 千笔帮你高效降AIGC

AI降重工具&#xff0c;让论文更自然、更安全 在研究生阶段&#xff0c;论文写作不仅是学术能力的体现&#xff0c;更是对研究深度和逻辑严谨性的考验。然而&#xff0c;随着AI写作工具的普及&#xff0c;许多学生在使用这些工具时&#xff0c;不可避免地面临“AIGC率过高”“…

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

《火锅英雄》取景地!白象居,把 8D 魔幻刻进居民楼里

在重庆市渝中区的长江之畔&#xff0c;有一片名为白象居的居民楼群&#xff0c;正以其独特的建筑形态成为山城立体空间美学的缩影。这片建于1992年的建筑&#xff0c;楼高24层&#xff0c;外观犹如一个依山而立的大型魔方&#xff0c;其最大特点是整栋建筑未设电梯。设计师巧妙…

作者头像 李华