個人學習--計算機組成原理篇
問題:2009年12月1日
今天在網上看到-12.5轉化成32位二進制浮點數為
11000001 01001000 00000000 00000000
哪位高人能分別給出具體具體的十進制數轉化成二進制浮點數,
還有二進制浮點數轉化成十進制數的過程。
為了能更詳細請給出-1.997436, 2.025675這兩個數的具體轉換過程
答案:
整數怎樣轉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
還要注意其他機器的浮點數表示方法可能與此不同. 不能任意移植
PS:最近對計算機組成原理比較感興趣,學習了一下基礎的計算機數據表示方法,感覺受益匪淺。