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

C 語言無符號整數比較陷阱:0 > (ui-1) 為何永假

     編輯:程式設計綜合問答

代碼分析

unsigned ui = 0;
if (0 > (ui - 1))  // 條件永遠為假
    a = 1;

核心原因

  • `ui` 為 `unsigned int`,值為 0
  • `ui - 1` 發生**無符號整數下溢**,結果為 `UINT_MAX`(通常 4294967295)
  • 比較 `0 > 4294967295` 為假

無符號整數運算規則

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;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved