1. 程式人生 > >浮點資料與4個單位元組的轉換

浮點資料與4個單位元組的轉換

前言:

在串列埠、IICSPI等資料傳送時基本上都是一次傳送一個位元組的資料,如果要傳送浮點資料?

通常是將浮點數乘以一個倍數,如10100100010000等,然後將其轉換為整型資料再轉化為單個位元組進行傳送。如果這個資料是要進行顯示的話,那麼這樣做並沒有什麼不好。但是如果這個數是要傳輸給另端進行繼續計算的話,那麼就要考慮另一種方法了,就是直接將浮點資料轉換為4個單位元組,在另一端接受完資料後再轉化為浮點資料,這種方式不會造成精度的丟失,計算量也比較小。

程式原始碼:

#include <stdio.h>

/*
要點提示:
1. float和unsigned long具有相同的資料結構長度
2. union據型別裡的資料存放在相同的物理空間
*/
typedef union
{
	float fdata;
	unsigned long ldata;
}FloatLongType;

/*
將浮點數f轉化為4個位元組資料存放在byte[4]中
*/
void Float_to_Byte(float f,unsigned char byte[])
{
	FloatLongType fl;
	fl.fdata=f;
	byte[0]=(unsigned char)fl.ldata;
	byte[1]=(unsigned char)(fl.ldata>>8);
	byte[2]=(unsigned char)(fl.ldata>>16);
	byte[3]=(unsigned char)(fl.ldata>>24);
}
/*
將4個位元組資料byte[4]轉化為浮點數存放在*f中
*/
void Byte_to_Float(float *f,unsigned char byte[])
{
	FloatLongType fl;
	fl.ldata=0;
	fl.ldata=byte[3];
	fl.ldata=(fl.ldata<<8)|byte[2];
	fl.ldata=(fl.ldata<<8)|byte[1];
	fl.ldata=(fl.ldata<<8)|byte[0];
	*f=fl.fdata;
}

/*
測試函式
*/
int main()
{
	float f=123456.789f;
	unsigned char byte[4]={0};

	printf("float data=%f\n",f);
	Float_to_Byte(f,byte);
	f=789.123456f;
	printf("changed float data=%f\n",f);
	Byte_to_Float(&f,byte);
	printf("float data=%f\n",f);

	return 0;
}

執行結果: