int vs char 格式指示符差異使用者發現同一變數用 %d (有號十進制整數) 與 %c (字元) 輸出,或隱式轉換後輸出值不同。
| 格式符 | 對應型別 | 解讀方式 | 輸出範例 (假設變數值 65) |
|---|---|---|---|
%d / %i | int | 有號十進制整數 | 65 |
%c | int (對應 char 提升) | 對應字元集編碼的字元 | A (ASCII 65) |
%x / %X | unsigned int | 十六進制整數 | 41 |
%o | unsigned int | 八進制整數 | 101 |
%f | double (float 提升) | 十進制浮點數 | 65.000000 |
printf **完全依賴格式字串**決定如何解讀這些位元。char 會經歷**整數提升**為 int,%c 取低 8 位對應字元,%d 印整數值。printf("%d", 3.14) 傳 double 給 %d,結果不可預期。char c = 'A'; // 值 65
printf("%d\n", c); // 65
printf("%c\n", c); // A
int i = 65;
printf("%c\n", i); // A (取低 8 位)
printf("%d\n", i); // 65
// 危險:有號/無號不匹配
unsigned int u = 4000000000u;
printf("%d\n", u); // UB: 可能印 -294967296 (視為有號 32 位)
printf("%u\n", u); // 正確: 4000000000
-Wformat -Wformat=2(GCC/Clang)自動檢查。char 數值用 %hhd (有號) / %hhu (無號) / %hhx (十六進制),明確指定寬度。size_t 用 %zu,ptrdiff_t 用 %td,intmax_t 用 %jd (C99)。printf("var = %d (0x%x)\n", var, var); 同時看十進制與十六進制位元模式。