浮點數與位元組資料的轉換

2021-07-26 03:54:29 字數 3132 閱讀 9245

摘自:

做專案時,碰到乙個問題:如何將32位的浮點數轉化成4個位元組資料進行傳送?下面給出演算法**:

/* *function:ftoc(float a) 

*decription:  浮點數轉化成四個位元組 

*input: 

*output: 

*/  

void ftoc(float a)//例如12.5--0x41 48 00 00;轉換完之後,e[0]-00,e[1]-00,e[2]-48,e[3]-41  

下面的**,是將4個位元組轉化成32位浮點數

/* *function:float bytetofloat(unsigned char* bytearray) 

*decription:  將位元組型轉化成32bits浮點型 

*input:長度為4的位元組陣列 

*output: 

*/  

float bytetofloat(unsigned char* bytearray)  

在c++裡,實數(float)是用四個位元組即三十二位二進位制位來儲存的。其中有1位符號位,8位指數字和23位有效數字位。實際上有效數字位是24位,因為第一位有效數字總是「1」,不必儲存。  有效數字位是乙個二進位制純小數。8位指數字中第一位是符號位,這符號位和一般的符號位不同,它用「1」代表正,用」0「代表負。整個實數的符號位用「1」代表負,「0」代表正。 

在這儲存實數的四個位元組中,將最高位址位元組的最高位編號為31,最低位址位元組的最低位編號為0,則實數各個部分在這32個二進位制位中的分布是這樣的:31位是實數符號位,30位是指數符號位,29---23是指數字,22---0位是有效數字位。注意第一位有效數字是不出現在記憶體中的,它總是「1」。      

將乙個實數轉化為c++實數儲存格式的步驟為: 

(1)先將這個實數的絕對值化為二進位制格式,注意實數的整數部分和小數部

分化為二進位制的方法是不同的。 

(2)將這個二進位制格式實數的小數點左移或右移n位,直到小數點移動到第

乙個有效數字的右邊。 

(3)從小數點右邊第一位開始數出二十三位數字放入第22到第0位。 

(4)如果實數是正的,則在第31位放入「0」,否則放入「1」。 

(5)如果n 是左移得到的,說明指數是正的,第30位放入「1」。如果n是右

移得到的或n=0,則第30位放入「0」。 

(6)如果n是左移得到的,則將n減去一然後化為二進位制,並在左邊加「0」

補足七位,放入第29到第23位。如果n是右移得到的或n=0,則將n化為二進位制後在

左邊加「0」補足七位,再各位求反,再放入第29到第23位。 

將乙個計算機裡儲存的實數格式轉化為通常的十進位制的格式的方法如下: 

(1)將第22位到第0位的二進位制數寫出來,在最左邊補一位「1」,得到二十

四位有效數字。將小數點點在最左邊那個「1」的右邊。 

(2)取出第29到第23位所表示的值n。當30位是「0」時將n各位求反。當30

位是「1」時將n增1。 

(3)將小數點左移n位(當30位是「0」時)或右移n位(當30位是「1」時)

,得到乙個二進位制表示的實數。 

(4)將這個二進位制實數化為十進位制,並根據第31位是「0」還是「1」加上正

號或負號即可。 

特別地,實數0用c++的float格式表示是0000000000000000000000000000000

0。 如果還不太明白,這裡舉幾個例子。 

一。將23.56化為c++的float格式。 

(1)將23.56化為二進位制後大約是「10111.1000111101011100001」。 

(2)將小數點左移四位,得到「1.01111000111101011100001」。 

(3)這已經有了二十四位有效數字,將最左邊一位「1」去掉,得到「0111

1000111101011100001」。將它放入第22到第0位。 

(4)因為23.56是正數,因此在第31位放入「1」。 

(5)由於我們把小數點左移,因此在第30位放入「1」。 

(6)因為我們是把小數點左移4位,因此將4減去1得3,化為二進位制,並補足

七位得到0000011,放入第29到第23位。 

完畢。 

如果把最左邊定為第31位,最右邊定為第0位,那麼在c++裡,float格式的2

3.56是這樣表示的:01000001101111000111101011100001。相應地-23.56就是這

樣表示的:11000001101111000111101011100001。 

二。將實數0.2356化為c++的float格式。 

(1)將0.2356化為二進位制後大約是0.00111100010100000100100000。 

(2)將小數點右移三位得到1.11100010100000100100000。 

(3)從小數點右邊數出二十三位有效數字,即11100010100000100100000放

入第22到第0位。 

(4)由於0.2356是正的,所以在第31位放入「0」。 

(5)由於我們把小數點右移了,所以在第30位放入「0」。 

(6)因為小數點被右移了3位,所以將3化為二進位制,在左邊補「0」補足七

位,得到0000011,各位取反,得到1111100,放入第29到第23位。 

完畢。因此0.2356用c++的float格式表示是:00111110011100010100000100

100000。其中最左邊一位是第31位,最右邊一位是第0位。 

三。將實數1.0化為c++的float格式。 

(1)將1.0化為二進位制後是1.00000000000000000000000。 

(2)這時不用移動小數點了,這就是我們在轉化方法裡說的n=0的情況。 

(3)將小數點右邊的二十三位有效數字00000000000000000000000放入第22

到第0位。 

(4)因為1.0是正的,所以在第31位里放入「0」。 

(5)因為n=0,所以在第30位里放入「0」。 

(6)因為n=0,所以將0補足七位得到0000000,各位求反得到1111111,放入

第29到第23位。 

完畢。所以實數1.0用c++的float格式表示是:0011111110000000000000000

0000000。其中最左邊一位是第31位,最右邊一位是第0位。

浮點數與位元組資料的轉換

做專案時,碰到乙個問題 如何將32位的浮點數轉化成4個位元組資料進行傳送?下面給出演算法 function ftoc float a decription 浮點數轉化成四個位元組 input output void ftoc float a 例如12.5 0x41 48 00 00 轉換完之後,e ...

位元組陣列與浮點數之間的互相轉換 IEEE

在做上位機開發過程中,經常會碰到位元組陣列與浮點數,整數等資料之間的轉換,有時為了驗證資料是否解析正確,得借助於ieee浮點數工具,本文把基於c 實現的浮點數與位元組陣列 或16進製制的字串 轉換的實現方法分享如下 將二進位制值轉ascii格式十六進製制字串 二進位制值 定長度的二進位制 ascii...

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

在串列埠 iic spi等資料傳送時基本上都是一次傳送乙個位元組的資料,如果要傳送浮點資料?通常是將浮點數乘以乙個倍數,如10,100,1000,10000等,然後將其轉換為整型資料再轉化為單個位元組進行傳送。如果這個資料是要進行顯示的話,那麼這樣做並沒有什麼不好。但是如果這個數是要傳輸給另端進行繼...