char/short`_Bool/枚舉` 參與運算先提升為 int(或 unsigned int),運算完成後再截断賦值回目標類型。
char c1 = 128; // 二進制 1000 0000,補碼表示 -128
char c2 = 1; // 0000 0001
char c3 = c1 + c2;
printf("%d\n", c3); // 輸出 -127
過程:
c1 提升為 int:-128(符號擴展)。c2 提升為 int:1。-127。char:保留低 8 位 1000 0001,補碼仍為 -127。
char c1 = 12; // 0000 1100
char c2 = 1; // 0000 0001
char c3 = c1 + c2;
printf("%d\n", c3); // 輸出 13
char 是否有符號由實現定義,攜帶負值時行為不同。char c3 = (char)(c1 + c2); 明確意圖。