什么是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格式在需要精确十进制表示的场景中仍然具有重要价值,尽管在现代通用计算中应用有所减少