回覆列表
  • 1 # 使用者2555472624673

    我繼續詳細說明下吧。

    首先C語言把a傳進printf,因為a是整型,所以不會自動轉成double型資料,直接將0x40000000傳進printf,而%f尋的是64位記憶體,也就是把0x0000000040000000這個記憶體中的資料當成浮點型輸出來,那浮點型的資料是多少呢,又是怎麼儲存的呢?

    64位浮點數的存放方式:

    63位 62~52位 51~0位

    1個符號位 11個階數 52個尾數

    從0x0000000040000000來看:

    1)符號位是0,表示正

    2)階數是0,解碼後實際值是:1-1023 = -1022,

    從而a用指數表示:1.#*2^-1022,‘#’是代表尾數。

    3)尾數就是,0x0000040000000

    4)浮點二進位制表示

    1.0000000000000000000001000000000000000000000000000000*2^(-1022),2^-1022次方可想而知有多小!

    這就是為什麼我們的int型資料用%f輸出是0.000000的原因!

    至於階數是0的時候表示-1022,可以參考如下深入學習,或者參考《深入理解計算機系統》第三版P81

    進一步學習:

    c語言格式輸出剖析--用%d輸出float型別資料與int型別%f格式輸出 - Solomon1558的專欄 - CSDN部落格

    浮點數儲存格式及精度詳解-idx001-ChinaUnix部落格

  • 中秋節和大豐收的關聯?
  • 危險化學物品運輸管理規定?