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