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

無號整數溢位原理:為何 0 - 1 = 2³²-1?

     編輯:程式設計綜合問答

C/C++ 中 unsigned int a = 0; cout << a - 1; 輸出 4294967295(即 2³²-1),初學者常困惑:「被減數全是 0,怎麼借位?」

核心結論

計算機無「借位」概念,全部運算皆為模 2ⁿ 的模組化加法,減法轉化為加上補碼。

詳細推導

  1. 型別轉換:1 為 int 常數,與 unsigned int a 運算時,1 隱式轉為 unsigned int(值不變,位模式 0x00000001)。
  2. 補碼表示:-1 的 32 位補碼為 0xFFFFFFFF(全 1)。
  3. 模組化加法:
      0x00000000  (a = 0)
    + 0xFFFFFFFF  (-1 的補碼)
    = 0xFFFFFFFF  (結果,無號解讀為 4294967295)
    
  4. 硬體實現:ALU 僅執行二進制加法,最高位進位(Carry Flag)被丟棄,不產生「借位」訊號。

關鍵知識點

  • 無號整數運算定義為模 2ⁿ 運算(C/C++ 標準),溢位不會 UB,直接環繞。
  • 補碼統一了加減法:A - B = A + (~B + 1),硬體只需加法器。
  • 位模式無符號/有號之分:0xFFFFFFFF 既是無號的 4294967295,也是有號的 -1,看型別如何解讀。

驗證程式

#include <stdio.h>
#include <stdint.h>

int main() {
    uint32_t a = 0;
    uint32_t result = a - 1;
    printf("結果: %u (0x%08X)\n", result, result); // 4294967295 (0xFFFFFFFF)
    printf("INT_MAX: %u, UINT_MAX: %u\n", INT_MAX, UINT_MAX);
    return 0;
}

理解「補碼 + 模組化加法」是掌握整數溢位、位運算、逆向工程的基石。

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