首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

原碼、反碼、補碼核心原理:為何計算機選擇補碼?

     編輯:關於C語言

原碼、反碼、補碼核心原理:為何計算機選擇補碼?

本文轉載自張子秋博客,系統闡述機器數/真值概念、三碼定義與轉換、原碼減法失敗、反碼解決減法但引入 ±0、補碼完美修復並多表示一個最小值的演進邏輯,是理解計算機算術基礎的經典教材。

一、機器數與真值

  • 機器數:帶符號位的二進制編碼,最高位 0 正 1 負。
    例:+3 → 00000011,-3 → 10000011(8 位)。
  • 真值:機器數代表的實際數值。
    例:10000011 真值 = -3,而非無符號值 131。

二、三碼定義(8 位示例)

值原碼反碼補碼
+10000 00010000 00010000 0001
-11000 00011111 11101111 1111

規則:正數三碼同;負數原碼=符號位+絕對值;反碼=原碼符號位不變其餘取反;補碼=反碼+1。

三、演進邏輯:從原碼到補碼

1. 原碼缺陷:符號位參與加法導致減法錯誤

1 - 1 = 1 + (-1)
原碼:[00000001] + [10000001] = [10000010] = -2 ❌

硬體若需識別符號位再決加減,電路極其複雜。

2. 反碼修正減法,但出現 ±0

反碼:[00000001] + [11111110] = [11111111] = -0 ❌

真值正確,但 +0=[00000000]、-0=[10000000] 兩編碼浪費且邏輯不清。

3. 補碼完美解決:唯一 0 + 多表示 -128

補碼:[00000001] + [11111111] = [00000000] = 0 ✅
  • 00000000 唯一表示 0。
  • 10000000 表示 -128(原/反碼無法表示)。
  • 8 位補碼範圍 [-128, +127],比原/反碼 [-127, +127] 多一值。

四、32 位 int 範圍由來

  • 最高位符號位,剩 31 位數值。
  • 補碼編碼下範圍 [-2³¹, 2³¹-1] = [-2147483648, 2147483647]。
  • 最小值 -2147483648 對應補碼 0x80000000,無原/反碼表示。

五、原文鏈接

https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

六、總結

補碼基於模運算同餘原理,將減法轉為加法,解決符號位硬體複雜度與 ±0 編碼浪費,成為通用計算機算術標準。理解此演進過程,是掌握計算機組成原理的關鍵一步。

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