char、short、_Bool、位域、枚舉類型 → int(若 int 能表示所有值),否則 → unsigned int。
此提升發生於:變量參與表達式、作為無原型函數參數、可變參數函數(如 printf)參數。
兩操作數類型不同時,按下列優先級轉換(高→低):
long doubledoublefloatunsigned long long → long long → unsigned long → long → unsigned int → int值保持原則:優先轉向有號類型(若能完整表示),否則轉無號。不同於 K&R C 的「無號保持」。
int d = -1;
size_t sz = 10;
if (d <= sz) // d 被轉為 unsigned int (巨大正數),條件恆真!
修正:if (d <= (int)sz) 或統一使用有號類型表示數量。
sizeof 'A' → 4(字符常量類型為 int,而非 char)。printf("%d", ch):char 提升為 int 入棧,%d 正確讀取。-Wsign-compare -Wconversion。