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

計算機組成原理:為何 1 的補碼全 0、-1 的補碼全 1?

     編輯:程式設計綜合問答

在有號整數的補碼表示中,+1 的二進制為 000...001,-1 卻是 111...111。這看似反直覺的設計,實則蘊含「模運算」與「硬體加法器統一」的精妙邏輯。

補碼定義回顧

  • 正數:原碼 = 反碼 = 補碼,符號位 0,數值位直接表示大小。
  • 負數:補碼 = 反碼 + 1(反碼 = 原碼除符號位取反)。

推導 -1 的補碼

1 的原碼(8位為例)   : 0 0000001
1 的反碼               : 1 1111110
1 的補碼 = 反碼 + 1    : 1 1111111  → 即 -1

同理,32 位 int 下:

+1 : 00000000 00000000 00000000 00000001
-1 : 11111111 11111111 11111111 11111111

為什麼要這樣設計?

1. 減法變加法,硬體只需加法器

A - B = A + (-B)。若 -B 用補碼表示,CPU 只需一組加法器即可完成加減法,無需額外減法電路。

2. 模 2^n 同餘系統

n 位元系統下,數值範圍為 [-2^(n-1), 2^(n-1)-1]。補碼本質上是 模 2^n 的同餘類代表元:

-1 ≡ 2^n - 1 (mod 2^n)
   = 111...111 (二進制)

因此 1 + (-1) = 1 + (2^n - 1) = 2^n ≡ 0 (mod 2^n),溢位捨棄後結果正確為 0。

3. 統一移位與擴展規則

  • 算術右移:符號位複製,負數除 2 正確(111...111 >> 1 = 111...111 即 -1/2 = -1 向下取整)。
  • 符號擴展:高位補符號位,int16_t -1 → int32_t 自動變 111...111。

特殊值:-2^(n-1) 只有補碼無原碼

以 8 位為例,-128 的補碼為 10000000。其原碼需 9 位表示(1 10000000),故補碼系統多出一個負數,範圍非對稱:[-128, 127]。

總結

-1 補碼全 1 不是巧合,而是模運算閉環與硬體電路極簡化的必然選擇。這個設計讓現代 CPU 能用同一組加法器、移位器處理有號/無號運算,是計算機體系結構中最優雅的工程決策之一。

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