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

C 語言無符號數正負判斷陷阱:變量 x 與 ux 類型差異導致邏輯誤解

     編輯:程式設計綜合問答

代碼:

int x = foo();           // 有符號 int
unsigned ux = x;         // 無符號複製
// 表達式 A: (x >= 0) || ((2*x) < 0)

題主誤以為 `ux` 無符號導致 `x` 也變無符號,**實際 `x` 仍是有符號 int**,`ux` 只是另一個無符號變量持有相同位模式。

表達式 A 分析

  • `x >= 0`:`x` 為負時為假。
  • `(2*x) < 0`:有符號溢出屬**未定義行為 (UB)**,編譯器可假設不發生,直接優化掉整個判斷。
  • 若 `x = INT_MIN` (-2147483648),`2*x` 溢出 UB,表達式值不可預測 → **A 為假 (不恆真)**。

關鍵區別

變量類型值範圍溢出行為
`x``int` (有符號)[-2³¹, 2³¹-1]UB (未定義行為)
`ux``unsigned int`[0, 2³²-1]定義良好:模 2³² 環繞

賦值 `unsigned ux = x;` 只是**位模式重新解讀** (補碼 → 無符號值),不改變 `x` 的類型與語義。

避坑原則

  • 有符號變量參與算術時,**永遠不要假設溢出環繞**,需先做範圍檢查或用更寬類型 (`long long`/`int64_t`)。
  • 需無符號語義時,聲明即用 `uint32_t`/`unsigned`,避免隱式轉換驚喜。
  • 開啟 `-Woverflow -Wsign-compare -fsanitize=undefined` (GCC/Clang) 捕獲 UB。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved