熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

printf打印float錯誤引起的思考[2]

2013-11-13 11:01:49  來源: .NET編程 

  關鍵是這幾句

    fldl xa

    fstpl xc(%esp)

    flds xa

    fstpl x(%esp)

  fldl把浮點地址交給浮點運算寄存器浮點寄存器是為精度的然後fstpl再把值取出按照位入棧表象就是按照double類型入棧了

  所以雖然內存中單精度浮點數是以字節存儲的但編譯器把它轉成了字節進行處理

  所以最後在棧裡的存儲就成了

    | |<——ESP

    | |

    | |

    | |

    | d |

    | |<——EBP

   printf的處理方式是將輸入參數按照字符串進行格式化解析由於輸入的是ld ld ld ld按照字節依次進行取值就得到了上面的結果

   float是單精度浮點遵從IEEE S(E(M(二進制位表示為×^ => 指數部分+=

  >小數部分為因此其浮點表示為

   也就是上面中看到的x打印出的十進制就是

  後來又找來台cavium位的機器上跑了一下發現都是正確的即使按照%d方式輸出也沒有問題沒法在cavium上反匯編無法確認

[]  []  


From:http://tw.wingwit.com/Article/program/net/201311/15020.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.