今天在公司討論項目重構的問題時,公司的 DBA 針對錶中的欄位大概介紹了一下 float 和 double 的存儲方式。然後,我發現這個問題又回到了浮點數類型在記憶體中的存儲方式,即 IEEE 對浮點數存儲的標準。 我在之前的內容中寫到過,在公司另外一個項目當中,在寫一個 TCP 伺服器時,對端的設備 ...
今天在公司討論項目重構的問題時,公司的 DBA 針對錶中的欄位大概介紹了一下 float 和 double 的存儲方式。然後,我發現這個問題又回到了浮點數類型在記憶體中的存儲方式,即 IEEE 對浮點數存儲的標準。
我在之前的內容中寫到過,在公司另外一個項目當中,在寫一個 TCP 伺服器時,對端的設備中發來的數據就存在浮點數,當時 TCP 伺服器使用的是 Java 的 Netty 寫的,而對端的設備中的程式是用 C 語言寫的,而數據中存在使用 IEEE 編碼表示的浮點數,所以 Java 寫的 Netty 要對 C 的浮點數進行解析,而不能直接使用。
之前的內容:IEEE 二進位浮點數的表示
對於數據在記憶體中的存儲,可能使用 C、C++ 或 ASM 等語言開發,會有一個較為清晰的瞭解和認識,畢竟這些可以很直觀的觀察記憶體中數據的存儲方式,因為只要想瞭解數據在記憶體中的存儲方式,可以直接打開調試器去觀察記憶體。
而其他語言可能比較困難,至少我不太清楚 Java 的數據在其記憶體中的存儲方式,而 PHP 的數據存儲方式查看起來也不是特別的方便。至少,對於 C、C++ 在 VS IDE 的調試環境中,我可以直接查看記憶體。而 Java 的 Eclipse、MyEclipse 的調試環境中,我並沒有註意到有查看變數在記憶體中存儲方式的相關視窗。至於 PHP 語言,以我短時間閱讀 PHP 底層源碼的經驗來看,應該存儲方式也使用了 IEEE 的存儲方式相同,因為 PHP 的這種“變體型類型”無非就是結構體中有數據類型的 type 欄位,然後根據不同的 type 在進行存儲。
所以,無論是學習哪種語言,我覺得都有必要學習一下 C 語言,C 語言雖然古老,但是它在底層對記憶體的操作還是值得去學習的,畢竟誕生幾十年的 C 語言,依然雄霸語言排行榜的第 2 位。
在道家有一句話叫“1 生 2,2 生 3,3 生萬物”。在程式界也有一句話,叫“ 0 1 生彙編, 彙編生 C,C 生萬物”。雖然 C 語言不是從彙編語言而來,但是,這句話至少反應了 C 在程式界地位。網上有一張圖很好的反應了 C 和其他主流語言的關係,製作很貼切的一張圖片,用忍者神龜和它們的老師來表現的。圖片的地址:
https://graph.baidu.com/resource/111e0f1732f6c977e382601572363399.jpg
C 已老去,但是有很多的語言中有 C 的影子,C 語言完成了 Unix、Linux 以及 Windows 操作系統,當然包括 Mac 系統,包括很多語言其底層也是 C 語言實現的。
如果有興趣體驗一下 IEEE 在記憶體中的存儲方式,可以參考如下地址:
http://www.yzmedu.com/learn/2218
我的微信公眾號:“碼農UP2U”