int a = 5;
printf("%f", a); // 輸出 0.000000
float b = a;
printf("%f", b); // 輸出 5.000000
| 類型 | 佔用字節 | 存儲格式 | 5 的二進制 |
|---|---|---|---|
| int (32位) | 4 | 補碼 | 00000000 00000000 00000000 00000101 |
| float (IEEE 754) | 4 | 符號位+指數+尾數 | 0 10000001 01000000000000000000000 |
printf("%f") 按 float 格式讀取 4 字節,將 int 的補碼誤解為浮點數,導致極小值(約 7e-45),顯示為 0.000000。
float 自動提升為 double (8 字節)。int 保持 4 字節,不提升為 double。%f 期望讀取 8 字節 (double),實際只取到 4 字節 int,高位殘留垃圾數據。int a = 5;
printf("%d", a); // 整數用 %d
printf("%f", (double)a); // 強轉 double
printf("%f", (float)a); // 強轉 float (會提升為 double)
啟用 -Wformat (GCC/Clang) 或 /W4 (MSVC) 會報警:format '%f' expects argument of type 'double', but argument has type 'int'。