《 C 語言的一些“騷操作”及其深層理解》之關于浮點數(shù)的傳輸
關于浮點數(shù)的傳輸
很多人不能很好的使用和處理浮點,其主要根源在于對它的表達與存儲方式不是很理解。最典型的例子就是經常有人問我:“如何使用串口來發(fā)送一個浮點數(shù)?”
我們知道C語言中有很多數(shù)據(jù)類型,其中unsigned char、unsigned short、unsigned int、unsigned long我們稱其為整型,顧名思義它們可以表達整型數(shù)。而能夠表達的數(shù)值范圍與數(shù)據(jù)類型所占用的字節(jié)數(shù)有關。數(shù)值的表達方法比如簡單,如下圖所示。
圖2.4 整型變量數(shù)值的計算方法
一個字節(jié)可以表達0~255,兩個字節(jié)(unsigned short)自然就可以表達0~65535,依次類推。
當需要把一個整型數(shù)值發(fā)送出去的時候,我們可以這樣作:
也就是將構成整型的若干字節(jié)順序發(fā)送即可。當然接收方一定要知道如何還原數(shù)據(jù),也就是說它要知道自己接收到的若干字節(jié)拼在一起是什么類型,這是由具體通信協(xié)議來保障的。
OK,關于整型比較容易理解。但是換成float,很多人就有些迷糊了。因為float的數(shù)值表達方式有些復雜。有些人使用下面的方法來進行浮點的發(fā)送。
很顯然這種方法非常的“業(yè)余”。還有人問我:“浮點小數(shù)字前后的數(shù)字可以發(fā)送,但是小數(shù)點怎么發(fā)?”這赤裸裸的體現(xiàn)了他對浮點類型的誤解。
不要被float數(shù)值的表象迷惑,它實質上只不過是4個字節(jié)而已,如圖2.5所示。
圖2.5 浮點變量數(shù)值的計算方法
所以,正確的發(fā)送浮點數(shù)的方法是這樣的:
接收者將數(shù)據(jù)還原為浮點:
其實我們應該發(fā)現(xiàn)數(shù)據(jù)類型的實質:不論是什么數(shù)據(jù)類型,它的基本組成無非就是內存中存儲的若干個字節(jié)。只是我們人為的賦予了這些字節(jié)特定的編碼方式或數(shù)值表達??创┝诉@些,我們就認識到了數(shù)據(jù)的本質了,我們甚至可以直接操作數(shù)據(jù)。