char c = 0xFF;
if (c == 0xFF) printf("相等");
else printf("不相等"); // 輸出:不相等
0xFF 賦值給 char 時發生溢位截斷,二進位 1111 1111 被視為補碼 -1。c 先擴展為 int(值為 -1,即 0xFFFFFFFF),再與 int 常數 0xFF(值 255,即 0x000000FF)比較,當然不相等。#include
#include
int main() {
char c = 0xFF;
printf("CHAR_MIN=%d, CHAR_MAX=%d\n", CHAR_MIN, CHAR_MAX); // -128, 127
printf("c = %d (0x%X)\n", c, c); // -1 (0xFFFFFFFF)
printf("0xFF = %d (0x%X)\n", 0xFF, 0xFF); // 255 (0x000000FF)
printf("c == 0xFF ? %s\n", c == 0xFF ? "true" : "false"); // false
return 0;
}
unsigned char c = 0xFF; // 範圍 0~255
if (c == 0xFF) ... // 相等
char c = 0xFF;
if ((unsigned char)c == 0xFF) ... // 強制無號比較
#include
uint8_t c = 0xFF; // 明確 8-bit 無號
if (c == 0xFF) ...
uint8_t / unsigned char。char 儲存數值;char 僅用於字元/字串。-Wsign-conversion / /W4)可在編譯期偵測隱性轉換問題。char c = 0xFF 實際儲存的是 -1,比較時提升為 int -1,與 int 255 自然不等。改用 unsigned char 或 uint8_t 即可獲得預期的 0~255 範圍與正確比較結果。