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

全部博文(724)

文章存档

2011年(1)

2008年(723)

我的朋友

分类:

2008-10-13 16:56:49

        計算機中的數據都是以二進制存儲的,通常我們所定義的變量類型各種各樣,而在內存中所對應的二制數據只能通過一定的轉化才能看到。整型的二進制容易通過計算獲取,對於float和double型的數據用手工計算顯得非常復雜,本文討論兩種獲取一個變量的二進制代碼的方法。
        雖然日常編程時經常提到二進制、十六進制數據,但在C中並未分開定義二進制、十進制和十六進制的變量類型,由於這三種類型是一一對應的關系,C中只定義了整型將以上三種類型作了統一。在需要顯示十進制或十六進制時,分別通過格式控制符%d和%x顯示出來。二進制數據需要自己編程實現。
        方法一:
        網上轉換二進制類型的方法通常是一位一位的比較獲取的,例如:
        void IntToBinary(int nNum,char *Buffer)
        {
                int i=0;
                int nTmp=0x80;                                        //欲比較的位
                memset(Buffer,'0',8);
                for(i=0;i<8;i++)
                {
                        if(nNum&nTmp)
                                Buffer[i]='1';                        //每位比較一次
                        nTmp>>=1;                                        //設定下一位,為下次比較作准備。
                }
                Buffer[i]='\0';                                        //字符串後加終止符。
        }
        注:此例只是介紹方法,8位是一個例子,多位的可根據以上程序很容易的調整。
        如果要轉換float型的數據,此方法就不行了。怎麼辦呢?
        比較笨的方法就是將float型強制轉換成int型,再做比較。直接轉換顯然不行,因為float強制轉換成int型會丟失小數位,如(int)3.4的結果是3,再轉成二進制則謬以千裡了。我們可以用指針來實現。請看:
         float f=12.3f;
         int *p;
         p=(int *)&f;
        再用上面的函數,則可輕易轉換成二進制數據。
         方法二:
        union即聯合體,它是一種將裡面的變量共用同一塊內存的數據存儲塊,對裡面的一個變量賦值,其它的變量也會跟著做相應的改變。聯合體可以巧妙的實現數據的轉換,先看程序再說。
        #include "Stdafx.h"
        #include "Afx.h"
        #include

        static union
        {
                float un_f;
                int un_i;
                double un_db;
                unsigned char un_c[8];
        };
        void VarToBinary(float f,char *Buffer);

        int main()
        {
                float f=12.3f;
                char Bin[33]="";
                VarToBinary(f,Bin);
                printf("%s",Bin);
                return TRUE;
        }
        void VarToBinary(float f,char *Buffer)
        {
                un_f=f;
                char tmp[9]="";
                for(int i=0;i<3;i++)
                {
                        itoa(un_c[3-i],tmp,2);
                        sprintf(Buffer+8*i,"%08s",tmp);
                }
        }

        在以上這個程序中,將聯合體聲句成全局的,在使用的時候就方便多了。看轉換函數中的使用。通過給un_f賦值,un_c[8]數組中的前四個字與un_f共用內存,所以表示出un_c[0]-un_c[3]的二進制數就是所需的值了。由於內存中的數據與日常顯示的順序相反,所以程序中做以調整,高位放前面,低位放後面。
       文中的程序經VC6.0,Win2000下調試成功。由於本人水平有限,難免有錯誤疏忽,望讀者批評指正。

发表于 2005-12-21 10:24 水石 阅读(818)   

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

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