分类:
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下調試成功。由於本人水平有限,難免有錯誤疏忽,望讀者批評指正。