十六进制和BCD码的那些事(终结篇)

十六进制转为BCD码好理解,有问题的是BCD码转为十六进制数;

Hex2Bcd:
0x3F的BCD码是多少?正确答案:99,或者0x63
0x3F=63,再加0x,->0x63, 再把0x63转为99(0x63=99)
1、如果要表示为十六进制,则转换为10进制数,前面加0x符号;(十六进制表示)

2、如果要表示为十进制,则先转换为10进制数,前面加0x符号,再把加上符号的
十六进制数转为十进制数;(十进制表示)

如果一个数为0x38,则BCD码为86


Bcd2Hex:(注:)
1、如果这个数是16进制表示的,把0x符号去掉,当成10进制数直接转换为16进制数即可;
(前提是这个16进制表示的数的任何一位不能大于9,也就是说不能出现A、B、C、D、E、F)
如:0x999,去掉0x,->999,再转为十六进制数为0x3E7
2、如果这个数是十进制表示的,先把这个数转换为16进制数,再把0x符号去掉,当成
十进制数,再转化为十六进制数即可;(注:这个数要在一定范围内,才行,如999转换为
十六进制为0x3E7,把0x去掉,3E7不在10进制表示范围内,)

  上面说的是在一定范围内的数,对于不在一定范围内的数怎么转?刚开始还真不好理解,
是因为学校教给我们的数学规则限制了我们的思维,对于一个数3E7,当成10进制怎么理解?
还是按十进制来,个位、十位、百位...,只不过现在十位上的数是14,

BCD码999转换为十六进制是多少?正确答案:447,若者0x1BF,为什么?想不通...
转换过程:
999转为十六进制,->0x3E7,
3
3*10+E=44
(3*10+E)*10+7
=447
也就相当于0x3E7当成10进制理解,则是3*100+E*10+7,简单不?


注:一个十六进制数转为BCD码,但这个BCD码再转为十六进制数,不等于这个数;
如:如果一个数为0x999,Hex2Bcd(0x999)=0x2547(9543),Bcd2Hex(0x2547)=0x9F3(2547)

  而一个BCD码的数可以转为十六进制数,这个十六进制数可以反转为BCD码,可能等于这个
数(这个数是十六进制表示,且每一位的数字在0~9之间);也可能不等于这个数;
如:Bcd2Hex(0x999)=0x3E7(999),Hex2Bcd(0x3E7)=2457(0x999)(等于)
   Bcd2Hex(0x9F3)=0x41D(1053),Hex2Bcd(0x41D)=0x1053(4179)
   Bcd2Hex(999)=0x1BF(447),Hex2Bcd(0x1BF)=0x447(1095)(不等于)

   Bcd2Hex(0x447)=0x1BF(447),Hex2Bcd(0x1BF)=0x447(1095)(等于)

结论:16进制转BCD不可逆,BCD转16进制有可能可逆。

你可能感兴趣的:(C51,单片机研究)