unsigned ui = 0;
if (0 > (ui - 1)) // 條件永遠為假
a = 1;
unsigned int a = 0;
unsigned int b = a - 1; // b = 4294967295 (32位系統)
// 等價於模 2^32 運算:(0 - 1) mod 2^32 = 2^32 - 1
int a = -1;
unsigned int b = 1;
if (a > b) // true 還是 false?
// a 隱式轉為 unsigned:-1 -> 4294967295
// 比較變為 4294967295 > 1 -> true
| 場景 | 建議 |
|---|---|
| 循環計數器 | 優先用有符號 `int`,避免下溢邏輯錯誤 |
| 位操作/標誌位 | 用 `unsigned` 或 `uint32_t`,明確語義 |
| 混合比較 | 顯式轉型:`(int)ui > 0` 或 `(unsigned)i > 0` |
| 邊界檢查 | 用 `if (ui > 0)` 而非 `if (ui - 1 >= 0)` |
若意圖是「ui 不為 0 時執行」:
if (ui > 0) // 直接判斷,清晰無歧義
a = 1;
若意圖是「ui-1 不溢出」:
if (ui != 0) // 等價邏輯
a = 1;