計算機32位浮點數二進制編解碼

原文參考:http://zhidao.baidu.com/question/42376730.html

有編輯

整數怎樣轉2進制,小數怎樣轉2進制就不說了。
                                                     
12.5: 
1. 整數部分12,二進制爲1100; 小數部分0.5, 二進制是.1,先把他們連起來,從第一個1數起取24位(後面補0):
1100.10000000000000000000
這部分是有效數字。(把小數點前後兩部分連起來再取掉頭前的1,就是尾數)
2. 把小數點移到第一個1的後面,需要左移3位, 加上偏移量127:127+3=130,二進制是10000010,這是階碼。
3. -12.5是負數,所以符號位是1。把符號位,階碼和尾數連起來。注意,尾數的第一位總是1,所以規定不存這一位的1,只取後23位:
1 10000010 10010000000000000000000
把這32位按8位一節整理一下,得:
11000001 01001000 00000000 00000000
就是十六進制的 C1480000.

2.025675                                     
1. 整數部分2,二進制爲10; 小數部分0.025675, 二進制是.0000011010010010101001,先把他們連起來,從第一個1數起取24位(後面補0):
10.0000011010010010101001
這部分是有效數字。把小數點前後兩部分連起來再取掉頭前的1,就是尾數: 00000011010010010101001
2. 把小數點移到第一個1的後面,左移了1位, 加上偏移量127:127+1=128,二進制是10000000,這是階碼。
3. 2.025675是正數,所以符號位是0。把符號位,階碼和尾數連起來:
0 10000000 00000011010010010101001
把這32位按8位一節整理一下,得:
01000000 00000001 10100100 10101001
就是十六進制的 4001A4A9.

-1.99744
還需要詳細說嗎?

如果只有小數部分,那麼需要右移小數點. 比如右移3位才能放到第一個1的後面, 階碼就是127-3=124. 

補充一個浮點二進制數手工轉換成十進制數的例子:
假設浮點二進制數是 1011 1101 0100 0000 0000 0000 0000 0000
按1,8,23位分成三段:
1 01111010 10000000000000000000000
最後一段是尾數。前面加上"1.", 就是 1.10000000000000000000000
下面確定小數點位置。階碼是01111010,加上00000101纔是01111111(127),
所以他減去127的偏移量得-5。(或者化成十進制得122,122-127=-5)。
因此尾數1.10(後面的0不寫了)是小數點右移5位的結果。要復原它就要左移5位小數點,得0.0000110, 即十進制的0.046875
最後是符號:1代表負數,所以最後的結果是 -0.046875

還要注意其他機器的浮點數表示方法可能與此不同. 不能任意移植.

發佈了100 篇原創文章 · 獲贊 55 · 訪問量 55萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章