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

為什麼 8 位二進制表示範圍是 -128 ~ +127?原碼、反碼、補碼深度解析

     編輯:Java 綜合教學

為什麼 8 位二進制表示範圍是 -128 ~ +127?原碼、反碼、補碼深度解析

計算機內部用二進制表示有符號整數,8 位元組(1 byte)有符號整數的範圍為 -128 ~ +127。這背後的關鍵在於補碼表示法。本文系統梳理原碼、反碼、補碼的定義、轉換規則,並解釋為什麼補碼能多表示一個數(-128),以及計算機為何統一採用補碼進行運算。

一、三種表示法對比

表示法正數負數8位範圍零的表示
原碼符號位 0 + 絕對值符號位 1 + 絕對值-127 ~ +127+0 (00000000)、-0 (10000000) 兩個
反碼同原碼符號位不變,數值位按位取反-127 ~ +127+0 (00000000)、-0 (11111111) 兩個
補碼同原碼反碼末位加 1-128 ~ +127唯一 0 (00000000)

二、補碼編碼詳解

正數(含 0)

補碼 = 原碼 = 反碼。最高位(符號位)為 0。
範圍:00000000 (0) ~ 01111111 (+127)。

負數

以 -1 為例:

  1. 原碼:10000001
  2. 反碼:11111110(符號位不變,數值位取反)
  3. 補碼:11111111(反碼 + 1)

以 -128 為例(特殊):

  1. 原碼:10000000(-0 的原碼)
  2. 反碼:11111111(-0 的反碼)
  3. 補碼:10000000(反碼 + 1 產生進位丟棄)

結論:補碼將原碼/反碼中浪費的 -0 (10000000) 編碼重新分配給 -128,因此範圍擴展為 -128 ~ 127,共 256 個值(2^8)。

三、為什麼計算機採用補碼?

  1. 統一加減法運算:減法轉為加法(A - B = A + (-B)),硬體只需加法器。
    例:1 - 1 = 1 + (-1)
    00000001 + 11111111 = 100000000 → 丟棄溢出進位 → 00000000 (0) ✓
  2. 零的唯一表示:避免 +0/-0 比較邏輯複雜。
  3. 符號位參與運算:無需額外電路處理符號位。
  4. 擴展性:符號擴展簡單(正數補 0,負數補 1)。

四、快速轉換口訣

  • 正數:三碼合一。
  • 負數求補碼:「原碼→反碼(數值位取反)→補碼(+1)」,或「從右向左找第一個 1,該位及右側不變,左側取反」(更快)。
  • 補碼求原碼:同理可逆(補碼 -1 → 反碼 → 原碼),或用同樣「找第一個 1」規則。

五、擴展:n 位補碼範圍公式

範圍: -2^(n-1) ~ 2^(n-1) - 1
總數: 2^n

位數範圍
8 (byte)-128 ~ 127
16 (short)-32,768 ~ 32,767
32 (int)-2,147,483,648 ~ 2,147,483,647
64 (long)-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

補碼是計算機科學中極具優雅的設計:用數學巧思解決硬體工程難題。理解其本質,不僅能搞清範圍由來,更能在處理位運算、溢出、序列化、網路協定解析時遊刃有餘。

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