分类:
2008-10-13 16:56:50
汇编程序中,经常用到十进制调整。在Windows可视化编程论坛中也经常遇到问这方面的问题,本文将讨论一种由整型数据转换成十进制调整后数据的方法。
BCD码即8421码,与十六进制数据不同的是,BCD码在每个字节中存放的数据都小于或等于9,与日常生活中的十进制类似,逢十进位,而不是十六进制的逢十六进位。由于计算机在存储数据都是以二进制处理的,所以十进制与十六进制转换在计算机中是不存在的,唯一区别的是输出表达方式不同。其实在输出时,计算机是将其转换成字符串输出,分别以%d和%x格式符控制转换成的相应的字符串类型。
为了区别8421码与普通编码的区别,下面举一个例子说明。
BCD码 普通编码
二进制数据 0000 0001 0001 0000 0000 0000 0000 1010
上面这一组数据都是十进制的10,由此更能看出,BCD码与普通编码之间的区别是存储方式上的区别,即编码上的不同;而日常编程中整型数据的十进制和十六进制仅仅是表达方式不同,在内存中的存储完全相同。例如 int i=0xA 和 int j=10,在作比较时 i==j成立;内存中二者都是0000 1010。
了解了BCD码,看下面一段程序,将一个整型数据转换成BCD码的过程。
void HexToBCD(const int nHex, BYTE Bcd[10])//整型数的最大为0x7FFFFFFF,十进制数是2147483647,共有10位数,所以转换成Bcd码时最多用10个字节
{
char cTmp[11]="",cStr[2]=""; //因字符串需加终止符,比最大字符数多一个存储空间。
int i;
sprintf(cTmp,"%010d",nHex); //转换成十进制数据
for(i=0;i<10;i++)
{
cStr[0]=cTmp[i];
sscanf(cStr,"%x",Bcd+i);
}
}
读者可根据该程序很方便的将任意一个正整数转换成BCD码。例如:
void main()
{
BYTE byBcdArr[10];
int nHex=2147483647;
HexToBCD(nHex,byBcdArr);
}
此例经过HexToBCD转换后,得到的结果是byBcdArr[0...9]分别为:2、1、4、7、4、8、3、6、4、7;
由于BCD码中一个字节只能存放一个小于10的数据,只用到半个字节,白白浪费了半个字节的存储空间,压缩BCD码解决了这个问题。由以上程序可以很简单的修改成压缩BCD码程序。如下:
void HexToBCD(const int nHex, BYTE Bcd[5])
{
char cTmp[11]="",cStr[3]="";
int i;
sprintf(cTmp,"%05d",nHex);
for(i=0;i<5;i++)
{
memcpy(cStr,cTmp+i*2,2);
sscanf(cStr,"%x",Bcd+i);
}
}
void main()
{
BYTE byBcdArr[5];
int nHex=2147483647;
HexToBCD(nHex,byBcdArr);
}
以上两程序经VC6控制台程序编译验证通过。