最近在學習C Primer Plus。書中第66頁,3.8 關鍵概念 這一小節中有這一段話:html
「計算機中的浮點數和整數在本質上不一樣,其存儲方式和運算過程有很大區別。即便兩個 32 位存儲單元存儲的位組合徹底相同,可是一個解釋爲 float 類型,另外一個解釋爲 long 類型,這兩個相同的位組合表示的值也徹底不一樣。例如,在 PC 中,假設一個位組合表示 float 類型的數 256.0,若是將其解釋爲 long 類型,獲得的值是 113246208。C 語言容許編寫混合數據類型的表達式,可是會進行自動類型轉換,以便在實際運算時統一使用一種類型。「學習
我本身的理解是:有兩個長度爲32位的存儲空間有一樣的位組合,它們分別存儲了 float 和 long 兩種類型。但由於 float 和 long 在計算機中的存儲方法和形式不一樣,致使了輸出的值不一樣。3d
拋出問題:在驗算中我得出的 long 類型的結果爲 1132462080,和原文結果不一樣,較書上數字多了一位 0。htm
首先探討 float 數據類型的存儲形式。blog
浮點型變量在計算機內存中佔用4個字節(4 Byte),即32-bit。這 32 位的存儲空間爲SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 的格式。內存
S部分:數符。表示浮點數的正負,1爲負數,0爲正數。ci
E部分:階碼。指數加上127後的值的二進制數。博客
M部分:尾數。規格化表示後底數去除整數位1的二進制數。it
Single precision單精度浮點數和 float 浮點數存儲形式相同io
*規格化的步驟:
(1)將 float 轉化爲二進制形式。
(2)用科學計數法表示第一步獲得的二進制數,獲得的指數加127既是E部分的階碼。
(3)科學計數法的小數部分,即M部分的尾數。
最後能夠獲得浮點數256.0的存儲形式:
0100(SEEE) 0011(EEEE) 1000(EMMM) 0000(MMMM)
0000(MMMM) 0000(MMMM) 0000(MMMM) 0000(MMMM)
32位的存儲空間裏包含了1個S,表明正負;8個E爲指數。實質上就是這個浮點數其數值的數量級;23個M,即這個數自己由哪些數字組成。
實質上這個32位存儲空間就是科學記數法的二進制」變種「,它包含了正負、數字和數量級,即表示了一個數。
#兩點補充:(1)爲何要給指數加127纔是階碼?答:浮點數的指數可正可負,指數E的存儲空間是帶符號的8位。因此根據IEEE標準,float 的指數取值範圍爲 -126 到 128,須要加上127來取消負數狀況。(2)爲何尾數是規格化後底數去掉整數位 1 的二進制數?答:科學記數法後底數部分實際是佔用24bit 的一個值,可是最高位始終爲1。因此最高位省去不存儲,在存儲中佔23bit。
關於 long 長整型數的存儲格式,我並無查到太多的相關資料,大多都是與 int、long long 相關等等。因該就是除了原碼、反碼、補碼相關知識以後,直接首位表正負,其餘二進制碼就是它的數值。
因此把浮點數 256.0 的 32 位存儲形式0100 0011 1000 0000 0000 0000 0000 0000轉化爲 long 獲得 1132462080,而非書上的 113246208 。
這篇文章的本意是藉此機會,來記錄一下學習了數據類型存儲形式和方法的知識成果。若是能有大神解決了個人問題,那更是再好不過!附上一條幫助我不少的博客的連接:https://www.cnblogs.com/chris-cp/p/4321793.html#undefined