用printf將int值按float列印為什麼結果會變為0?

時間 2021-06-01 12:56:27

1樓:hsldymq

x86的架構,union中int和float共用乙個32位的儲存空間

你把給int賦的值轉換為二進位制,這個值也就是float的值,然後自己用IEEE754標準計算一下是多少你就知道了,如果你不懂IEEE754和移碼,查查資料,就當拓展知識面了

2樓:劉項

0001 0010 0011 0100 0101 0110 0111 1000

第一位符號位0

接下來8位是指數字: 0010 0100, 換算成十進位制是: 36。不過浮點數的格式規定,這個數還要減去127才是真正的指數,36 - 127 = -91

最後23位是底數字。不過浮點數的格式規定,這個數前面要加上1.才是真正的底數,所以底數是1.

011 0100 0101 0110 0111 1000。這個數換算成十進位制大約是1.40625。

最後整個浮點數的值是 1.40625 * 2 ^ -91計算結果是5.6797985e-28

也就是零點零零零(一共28個零)五六七九七九八五。

printf後面的%f只保留6個有效數字,所以就變成0了。

3樓:時國懷

int32的整數0x12345678在記憶體中表示為:

低位址->高位址

0x78 0x56 0x34 0x12

這段記憶體資料如果翻譯成對應的float型別資料是5.69046e-28 (另一種寫法:5.69046*10^-28)這麼小的數列印出來就是0.00000

把%f換成%g就可以讓printf用科學計數法輸出了。

至於float型別在記憶體中如何表示,請參考這裡:

Single-precision floating-point format

截個圖:

4樓:Milo Yip

這個16進製制值所表示的IEEE-754單精度浮點數值是比較小的(10^-28),用"%f"只能顯示10^-6的小數範圍,改用"%.17g"可以把值完整地列印出來。

C語言如何將int資料放到double小數部分?

醉臥沙場 不明白為什麼這種也要出來 拜神 給你兩種方法,拿去交作業吧 有心就自己弄明白了再交,要是弄不明白就趁早轉乙個合適的專業 程式 mytest.c include include intmain int argc char argv 編譯,測試執行 gcc o mytest mytest.c ...

為什麼C語言用printf 列印數值的十進位制 八進位制 十六進製制時,有時會擴充套件到32位有時不會?

暮無井見鈴 傳遞引數給省略號形參時,會經過 整型提公升 對於 char short 等 短於 int 的型別,如果能轉換到 int 且值不改變則轉換到 int 否則轉換到 unsigned int 浮點提公升 float 轉換到 double 問題裡的程式不涉及 這裡程式存在未定義行為。因為 fpr...

男生如何將顏值變現?

亓月 顏值,真的不僅僅是臉。還有你骨子裡的氣質,你的舉手投足散發的獨特魅力。你的衣品,內在,見識,三環。顏值在我看來應該是所有因素的綜合得分。不然怎麼會有情人眼裡出西施呢?正是因為每個人對每個因素的標準不同結果也不同 Amireux 最起碼要整潔吧!我覺得氣質很重要!不要留指甲!勤洗頭!有自信!有談...