文章目錄
- 前言
- 一、浮點數的表示方法
- 二、浮點數在記憶體中的存盤
- 1、符號位S
- 2、有效數字M
- 3、指數部分E
- 三、感謝閱讀,如有錯誤請批評指正
前言
我們都知道整型資料在記憶體中是以補碼形式存盤的,并且我們可通過原碼、反碼和補碼之間的關系很容易地進行計算,
那么浮點數在記憶體中又是如何存盤的呢?
一、浮點數的表示方法
關于浮點數的表示方法,許多都是標準規定的,不必深究,
根據國際標準IEEE(電氣和電子工程協會) 754,任意一個二進制浮點數V可以表示成下面的形式:
(-1) ^ S * M * 2 ^ E
其中:
(-1) ^ S 表示符號位,當S=0,V為正數;當S=1,V為負數,
M 表示有效數字,大于等于1,小于2,
2 ^ E 表示指數,
注:
1、這里的有效數字范圍是[1,2),可類比十進制中有效數字的范圍是[1,10),
2、指數部分以2為底數,類比十進制中指數部分以10為底數,
例如十進制中的5.0,寫成二進制浮點數是101.0,用該形式表示就是(-1) ^ 0 * 1.01 * 2 ^ 2
(其中S = 0, M = 1.01, E = 2)
又如十進制中的-5.5,寫成二進制浮點數是101.1(此處小數點后的第一位權重是2 ^(-1),也就是0.5,所以此處是1),用該形式表示就是(-1) ^ 1 * 1.011 * 2 ^ 2
(其中S = 1, M = 1.011, E = 2)
二、浮點數在記憶體中的存盤
根據IEEE754標準規定:
對于32位的浮點數(float型),最高的一位是符號位S,接下里8位是指數E,剩下的23位為有效數字M,
對于64位的浮點數(double型),最高的1位是符號位S,接著的11位是指數E,剩下的52位為有效數字M,
1、符號位S
對于符號位S,只有0和1兩種情況,分別表示正和負,此處不多贅述
2、有效數字M
對于有效數字M,由于M的范圍是[1,2),也就是說M的整數部分一定為1,所以IEEE754標準規定:在計算機內部保存M時,默認這個數的第一位總是1,因此可以被舍去,只保存后面的小數部分,
比如保存1.01的時候,只保存小數部分01,而將整數部分的 1舍去,等到讀取的時候,再把第一位的1加上去,這樣做的目的,是節省1位有效數字,32位浮點數留給M只有23位,將第一位舍去后,就可以保存24位有效數字,
3、指數部分E
對于指數部分E,情況就比較復雜,
(1)指數部分E是一個無符號整數(unsigned int),如果E為8位(32位浮點型),那么E能表示的范圍是0 ~ 255;如果E為11位(64位浮點型),那么E能表示的范圍是0 ~ 2047,
那么問題來了,這個指數E顯然可以為負,但unsigned int的型別使E為非負數,所以IEEE754標準規定,存入記憶體中時,真實的指數必須加上一個中間值(對于8位的E,這個中間值是127,對于11位的E,這個中間值是1023),
如一個32位浮點數的E = 3,那么在存入記憶體中時要加上127變為130后再換算成二進制1000 0010后存盤
(2)E不全為0或不全為1
下面以上文的5.0和-5.5為例講解,
對于浮點數5.0:
S = 0
M = 1.01 需將整數部分的1去掉,然后把小數部分的01存盤,后面多余的位用0補齊
E = 2 需加上127變為129并轉換為2進制后存盤
則5.0表示為2進制為0 10000001 01000000000000000000000
在記憶體中以16進制展示,即40 a0 00 00


圖片中位元組反向涉及到大端存盤和小端存盤,此處不多贅述,
對于浮點數-5.5:
S = 1
M = 1.011 需將整數部分的1去掉,然后把小數部分的011存盤
E = 2 需加上127變為129并轉換為2進制后存盤
則-5.5表示為2進制為1 10000001 01100000000000000000000
在記憶體中一般以16進制展示,即c0 b0 00 00


(3)E全為0時
由于E加上后127為全0,也就是說E的真實值為-127,即該浮點數指數部分是2 ^ (-127),顯然這是一個極小的數,此時有效數字M不再加上第一位的1,而是還原為以0為整數的小數,這樣做是為了表示±0,以及接近于0的很小的數字,
(4)E全為1時
由于E加上后127為全1,也就是說E的真實值為128,即該浮點數指數部分是2 ^ (128),顯然這是一個極大的數,此時表示正負無窮大(正負號由S決定)
(3)(4)中以32位浮點數為例,64位浮點數同理
三、感謝閱讀,如有錯誤請批評指正
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/256837.html
標籤:其他
上一篇:單調堆疊演算法筆記
下一篇:服務配置中心:Config
