程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> 計算機組成原理-IEEE 754標准下, 浮點數1的機器碼表示

計算機組成原理-IEEE 754標准下, 浮點數1的機器碼表示

編輯:編程綜合問答
IEEE 754標准下, 浮點數1的機器碼表示

用反匯編得到了浮點數1的機器碼,根據IEEE 754標准推斷,卻發現匹配不上。
具體如下:
float f = 1.0f;
這句話反匯編後,匯編代碼如下:
mov $0x3f800000,%eax
mov %eax,-0x4(%ebp)
這裡的0x3f800000應該是浮點數的1的機器碼表示,該機器碼表示應當符合IEEE 754標准。
標准如下:
對於短實數,即32位實數,格式如下:
符號位 階碼 尾數
1 8 23
則可知,0x3f80000(二進制表示為: 0011 1111 1000 0...0)的
符號位: 0(表示正數)
階碼: 01111111
尾數: 全0

按照IEEE 754標准,尾數中最高位的1會被省略,則可知尾數為1.0,恰好是浮點數1的值。而符號位也是正確的,現在需要看的就是階碼了。
最終的結果應為:尾數 * (2的階碼次方),那麼階碼的值應該為0.
階碼是用移碼表示的,並且對於短實數,標准規定,其階碼值還有加上0x7FH.
0的移碼是10000000, 再加上0x7FH是全1,但是上述的階碼不是全1.為什麼?

如果逆向推倒, 階碼01111111 - 0x7FH 得到的移碼為:00000000
則對應的補碼為: 10000000, 這是表示 -128的補碼。 沒有得到期望中的階碼。
為什麼?

最佳回答:


該問題已經解決。
上述表述中有誤之處在於對於“階碼值加上0x7FH”的誤解。
在維基百科中對移碼的解釋中可以看到
標准移碼為補碼加上10000000,而IEEE 754標准采用的為非標准的移碼, 即它是將補碼加上(10000000 - 1)來得到移碼的,也就是上述的0x7FH.
也即IEEE 754的階碼采用非標准移碼,而加上的偏移量0x7FH就是為了得到這個非標准移碼。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved