我繼續詳細說明下吧。
首先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部落格
我繼續詳細說明下吧。
首先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部落格