BCD格式详细介绍

BCD格式详细介绍

什么是BCD格式

BCD(Binary-Coded Decimal,二进制编码的十进制)是一种数字编码方式,它使用4位二进制数来表示一个十进制数字(0-9)。与直接将数字转换为二进制不同,BCD保持了十进制数的位结构,只是用二进制形式表示每个十进制数字。

BCD的基本原理

每个十进制数字(0-9)用4位二进制表示

多位十进制数表示为多个4位二进制组的序列

例如:十进制数25表示为BCD码:0010 0101

BCD编码方式

1. 压缩BCD(Packed BCD)

每个字节存储两个十进制数字

高4位存储十位数字,低4位存储个位数字

例如:十进制数57的压缩BCD码为0101 0111

常见与RTC时钟,如GD32的RTC结构体中就采用BCD:

/* constants definitions */

/* structure for initialization of the RTC */

typedef struct

{

uint8_t year; /*!< RTC year value: 0x0 - 0x99(BCD format) */

uint8_t month; /*!< RTC month value */

uint8_t date; /*!< RTC date value: 0x1 - 0x31(BCD format) */

uint8_t day_of_week; /*!< RTC weekday value */

uint8_t hour; /*!< RTC hour value */

uint8_t minute; /*!< RTC minute value: 0x0 - 0x59(BCD format) */

uint8_t second; /*!< RTC second value: 0x0 - 0x59(BCD format) */

uint16_t factor_asyn; /*!< RTC asynchronous prescaler value: 0x0 - 0x7F */

uint16_t factor_syn; /*!< RTC synchronous prescaler value: 0x0 - 0x7FFF */

uint32_t am_pm; /*!< RTC AM/PM value */

uint32_t display_format; /*!< RTC time notation */

}rtc_parameter_struct;

2. 非压缩BCD(Unpacked BCD)

每个字节只存储一个十进制数字

低4位存储数字,高4位通常为0

例如:十进制数5的非压缩BCD码为0000 0101

BCD的优势

精确表示十进制小数:避免了二进制浮点数表示时的舍入误差

易于人类阅读:与十进制数字直接对应

简化输入/输出转换:不需要复杂的二进制-十进制转换

财务计算友好:适合需要精确十进制表示的场景

BCD的局限性

存储效率低:相比纯二进制表示,需要更多存储空间

算术运算复杂:需要特殊硬件支持或软件算法

存在无效状态:4位二进制有16种可能,但只使用10种(0000-1001)

BCD的变种

8421码:最常用的BCD码,权重与二进制相同

余3码:每个数字表示为BCD码加3(3=0011)

2421码:使用不同的位权重

格雷码:相邻数字只有一位不同

BCD的应用场景

金融系统(银行、会计软件)

电子计算器

数字显示设备(如七段显示器)

需要高精度十进制运算的场合

某些嵌入式系统和微控制器

BCD运算注意事项

进行BCD运算时需要考虑:

调整操作:当结果大于9时需要进行加6调整

进位处理:处理跨数字的进位

符号表示:通常使用额外的4位表示正负(如1100表示正,1101表示负)

BCD格式在需要精确十进制表示的场景中仍然具有重要价值,尽管在现代通用计算中应用有所减少

相关推荐

霜降除了进补,还要注意这些问题……
btbt365me

霜降除了进补,还要注意这些问题……

📅 08-11 👁️ 4623
windows下如何使用自带的摄像头录像?
btbt365me

windows下如何使用自带的摄像头录像?

📅 07-29 👁️ 9908
护驾的意思
GBT36507-2018

护驾的意思

📅 08-12 👁️ 7786
春天在哪里歌词
GBT36507-2018

春天在哪里歌词

📅 07-18 👁️ 7276
英雄战歌宝箱怎么得 英雄战歌宝箱获取攻略
梅西夺取世界杯冠军,阿根廷会获得多少奖金呢?梅西退役悬念揭晓