| 格式符 | 對應類型 | 語義 |
|---|---|---|
%ld | long int | 長整型(有符號) |
%lf | double | 雙精度浮點型 |
int:通常 16/32 位,視平台而定;long:C90 保證 ≥32 位,Windows 64 位下仍為 32 位,Linux 64 位為 64 位;long long:C99 引入,保證 ≥64 位,打印用 %lld。建議:使用 <stdint.h> 定義的 int32_t、int64_t 等確寬類型,配合 PRId32、PRId64 宏,實現跨平台無縫遷移。
float:單精度,32 位,有效位數約 6-7 位,%f;double:雙精度,64 位,有效位數約 15-16 位,%lf(scanf 必須用 %lf,printf 兼容 %f);long double:擴展精度,通常 80/128 位,%Lf。double d;
scanf("%f", &d); // 錯誤!%f 對應 float*,會導致棧損壞
scanf("%lf", &d); // 正確
printf("%f", d); // 正確,printf 可用 %f 輸出 double
printf("%lf", d); // 也正確,C99 允許
根本原因:scanf 需要根據格式符確定寫入內存的字節數,而 printf 只讀取值,float 會默認提升為 double 入棧。
| 場景 | 類型 | scanf | printf |
|---|---|---|---|
| 長整數 | long | %ld | %ld |
| 長長整數 | long long | %lld | %lld |
| 雙精度 | double | %lf | %f / %lf |
| 長雙精度 | long double | %Lf | %Lf |