首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言 char 型別陷阱:為何 0xFF != 0xFF?

     編輯:程式設計疑難解答

現象

char c = 0xFF;
if (c == 0xFF) printf("相等");
else printf("不相等");  // 輸出:不相等

根本原因:char 有號性與整數提升

  1. char 預設為 signed char(視編譯器實作而定,常見為 -128 ~ 127)。
  2. 0xFF 賦值給 char 時發生溢位截斷,二進位 1111 1111 被視為補碼 -1。
  3. 比較時發生整數提升: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;
}

解決方案

1. 使用 unsigned char

unsigned char c = 0xFF;  // 範圍 0~255
if (c == 0xFF) ...       // 相等

2. 比較前轉型

char c = 0xFF;
if ((unsigned char)c == 0xFF) ...  // 強制無號比較

3. 使用 uint8_t(C99 stdint.h)

#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 範圍與正確比較結果。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved