Chinaunix首页 | 论坛 | 博客
  • 博客访问: 468101
  • 博文数量: 724
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(724)

文章存档

2011年(1)

2008年(723)

我的朋友

分类:

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控制台程序编译验证通过。

发表于 2005-12-05 19:56 水石 阅读(976)   

--------------------next---------------------

阅读(1001) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~