浮點資料與4個單位元組的轉換
阿新 • • 發佈:2019-01-28
前言:
在串列埠、IIC、SPI等資料傳送時基本上都是一次傳送一個位元組的資料,如果要傳送浮點資料?
通常是將浮點數乘以一個倍數,如10,100,1000,10000等,然後將其轉換為整型資料再轉化為單個位元組進行傳送。如果這個資料是要進行顯示的話,那麼這樣做並沒有什麼不好。但是如果這個數是要傳輸給另端進行繼續計算的話,那麼就要考慮另一種方法了,就是直接將浮點資料轉換為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; }
執行結果: