C/C++ 中 unsigned int a = 0; cout << a - 1; 輸出 4294967295(即 2³²-1),初學者常困惑:「被減數全是 0,怎麼借位?」
計算機無「借位」概念,全部運算皆為模 2ⁿ 的模組化加法,減法轉化為加上補碼。
1 為 int 常數,與 unsigned int a 運算時,1 隱式轉為 unsigned int(值不變,位模式 0x00000001)。-1 的 32 位補碼為 0xFFFFFFFF(全 1)。 0x00000000 (a = 0)
+ 0xFFFFFFFF (-1 的補碼)
= 0xFFFFFFFF (結果,無號解讀為 4294967295)
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;
}
理解「補碼 + 模組化加法」是掌握整數溢位、位運算、逆向工程的基石。