什么是原碼和補碼

補碼的本質確實是模運算(Modular Arithmetic),這是理解補碼為何能統一加減法的核心數學原理。下面用最通俗的語言和例子解釋清楚:
—### 1. 先理解什么是“模運算”- 模運算就是“周期性計數”,比如鐘表: - 鐘表只有12小時,超過12就重新開始(模12)。 - 例如:15點 → 15 - 12 = 3點(15 mod 12 = 3)。 - 負數例子:如果現在是3點,8小時前是幾點? - 直接減:3 - 8 = -5 → 負數無法直接表示在鐘表上。 - 用模運算轉換:-5 + 12 = 7 → 7點(相當于-5 ≡ 7 mod 12)。—### 2. 計算機的“模”是什么?- 計算機的二進制位數是固定的(比如8位、32位),天然適合模運算。 - n位二進制的模是 (2^n): - 例如:8位二進制的模是 (2^8 = 256)。 - 所有運算結果超出位數時,自動丟棄高位(相當于取模)。—### 3. 補碼的本質:用模運算表示負數- 核心思想:將負數轉換為一個等效的正數(通過模運算),讓加減法統一為加法。 - 例如:在8位系統中,如何表示 -5? - 計算:(256 - 5 = 251) → 251 的二進制是 1111 1011,這就是 -5 的補碼。 - 驗證5 + (-5) = 0 → 補碼運算: 5(0000 0101) + 251(1111 1011) = 256(1 0000 0000) → 丟棄溢出位 → 0000 0000(0,正確!)—### 4. 為什么補碼能統一加減法?- 所有負數都表示為“模 - 絕對值”: - 在8位系統中,-x ≡ (2^8 - x)(即 (256 - x))。 - 加減法等價于模運算: - 例如:A - BA + (256 - B) mod 256。 - 硬件自動丟棄溢出位,結果自然正確。#### 案例:用鐘表理解補碼- 問題:鐘表時間是3點,如何表示“-5小時”? - 直接減:3 - 5 = -2 → 無法直接表示。 - 用模12轉換:-5 ≡ 12 - 5 = 7 → 加7小時: - 3點 + 7小時 = 10點 → 等價于3點 -5小時 = 10點(正確,因為鐘表是循環的)。 - 計算機同理:用補碼將負數轉換為等效正數,運算后自動取模。—### 5. 補碼的數學公式- 對于n位二進制,補碼的定義: - 正數:直接表示。 - 負數:(-x) 的補碼 = (2^n - x)。- 運算規則: - (A + (-B)) ≡ (A + (2^n - B)) ≡ (A - B) mod (2^n)。#### 案例:8位系統中計算 10 - 71. 轉換為補碼加法:10 + (-7)2. 計算補碼: - -7 的補碼 = 256 - 7 = 249 → 二進制 1111 1001。3. 運算0000 1010(10) + 1111 1001(-7的補碼) = 1 0000 0011 → 丟棄溢出 → 0000 0011(3,正確!)—### 6. 補碼的直觀優勢1. 符號位即數值: - 最高位是1時,代表這個數是“模 - 正數”。 - 例如:8位補碼 1000 0001 = (256 - 127 = 129) → 實際表示 -127。2. 硬件無需區分正負: - 加減法統一用加法器完成,符號位直接參與運算。3. 自然處理溢出: - 運算結果超出位數時,丟棄高位即等效于取模。—### 總結- 補碼是模運算在計算機中的具體應用: - 負數 -x 被表示為 (2^n - x)。 - 加減法統一為加法,結果自動取模。- 記住這個公式: - 在n位系統中-x ≡ (2^n - x)(這就是補碼的好的!這次我們徹底講透,用最直觀的方式,結合數學原理和實際案例,保證你理解并記住。


終極目標:計算機如何用二進制表示負數,并正確運算?

關鍵矛盾:
  • 計算機只能處理 0 和 1,沒有“負號”
  • 必須用純二進制數同時表示正數和負數
  • 加減法必須統一用加法電路完成(否則硬件成本高)。

一、原碼:直觀但缺陷明顯

定義
  • 最高位為符號位:0 正,1 負。
  • 其他位為數值的絕對值
  • 例子(8位):
    • +50 000 0101(符號位+5的絕對值)
    • -51 000 0101(符號位+5的絕對值)
致命問題
  • 直接運算會出錯
    # 計算 5 + (-5):0000 0101  (+5)
    + 1000 0101  (-5)
    = 1000 1010  (十進制是 -10,但正確結果應為 0!)
    
  • 雙零問題0000 0000(+0)和 1000 0000(-0)同時存在。

二、反碼:試圖改進運算

定義
  • 正數:與原碼相同。
  • 負數:符號位不變,數值位取反(0→1,1→0)。
  • 例子(8位):
    • -51 111 1010(原碼1000 0101的數值位取反)
運算嘗試
  • 計算 5 + (-5)
      0000 0101  (+5的反碼)
    + 1111 1010  (-5的反碼)
    = 1111 1111  (反碼的-0,十進制為 0,但有兩個零)
    
  • 問題
    1. 雙零問題依然存在0000 00001111 1111)。
    2. 需要處理進位:如果運算后最高位有進位,需循環加回結果末尾。

三、補碼:徹底解決問題的終極方案

定義
  • 正數:與原碼相同。
  • 負數:反碼 + 1(等價于用模運算表示負數)。
  • 例子(8位):
    • -5 的補碼:
      原碼:1000 0101
      反碼:1111 1010  (數值位取反)
      補碼:1111 1011  (反碼 +1)
      
補碼的數學原理
  • 本質是模運算(鐘表原理)

    • 假設用 8 位二進制(范圍 0~255),模為 256。
    • 負數 -x 等價于 模 - x
      • -5256 - 5 = 251 → 二進制 1111 1011(這就是補碼)。
  • 運算自動溢出

    # 計算 5 + (-5):0000 01015的補碼)
    + 1111 1011-5的補碼)
    = 1 0000 0000  (結果超出 8 位,最高位 1 被丟棄)
    → 最終結果:0000 00000,正確!)
    
補碼的絕對優勢
  1. 統一加減法:減法 A - B 等于 A + (-B) 的補碼加法。
  2. 符號位直接參與運算:無需額外判斷符號。
  3. 單零問題:只有 0000 0000 表示 0。
  4. 硬件電路簡單:只需一個加法器,無需減法器。

四、補碼的深度案例解析

案例1:8位補碼范圍
  • 最大正數0111 1111 → +127。
  • 最小負數1000 0000 → -128。
  • 為什么是 -128?
    • 8位補碼中,1000 0000 沒有對應的原碼,直接規定為 -128。
    • 數學上:1000 0000 = -128(因為 -128 + 127 = -1,而 1000 0000 + 0111 1111 = 1111 1111(-1的補碼))。
案例2:補碼的快速轉換
  • 已知補碼求十進制

    • 補碼 1111 1011
      1. 符號位為 1 → 負數。
      2. 數值位取反加1:1111 1011 → 取反 0000 0100 → 加1 → 0000 0101 → 絕對值 5。
      3. 結果:-5。
  • 十進制轉補碼

    • -20 的8位補碼:
      1. +20 的原碼:0001 0100
      2. 數值位取反:1110 1011
      3. 加1:1110 1100 → 這就是 -20 的補碼。
案例3:跨零運算
  • 計算 3 - 5(等價于 3 + (-5)):
    3的補碼:0000 0011
    -5的補碼:1111 1011
    相加:0000 0011
    + 1111 1011
    = 1111 1110  (結果的補碼)
    → 轉十進制:符號位1 → 負數,數值位取反加10000 0010-2(正確!3-5=-2)。
    

五、為什么必須用補碼?

  1. 硬件成本:補碼讓加減法統一用加法器實現,無需額外減法電路。
  2. 運算一致性:符號位直接參與運算,無需特殊處理。
  3. 單零問題:避免程序中出現 +0-0 的歧義。
  4. 數學嚴謹性:補碼的本質是模運算,完美契合二進制溢出特性。

終極記憶口訣

  • 原碼:看符號,算絕對值(但算不對)。
  • 反碼:負數取反,雙零還在(運算要加回進位)。
  • 補碼:負數取反加一,符號直接運算(一切問題解決)。

總結表格

編碼正數表示負數表示零的個數能否直接運算?
原碼符號位0+絕對值符號位1+絕對值2個? 出錯
反碼同原碼符號位1+數值位取反2個?? 需處理進位
補碼同原碼符號位1+數值位取反+11個? 完美

徹底理解補碼后,你就能看透計算機底層的一切數值運算!這就是為什么現代計算機全部使用補碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80814.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80814.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80814.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

筆記項目 day02

一、用戶登錄接口 請求參數: 用loginDTO來封裝請求參數,要加上RequestBody注解 響應參數: 由于data里內容較多,考慮將其封裝到一個LoginUser的實體中,用戶登陸后,需要生成jwtToken并返回給前端。 登錄功…

2025年土木建筑與水利工程國際會議(ICCHE 2025)

2025 International Conference on Civil and Hydraulic Engineering (ICCHE 2025) (一)會議信息 會議簡稱:ICCHE 2025 大會地點:中國銀川 投稿郵箱:icchesub-paper.com 收錄檢索:提交Ei Compendex,CPCI,C…

運行Spark程序-在shell中運行1

(一)分布式計算要處理的問題 【老師提問:分布式計算要面臨什么問題?】 【老師總結】 分布式計算需要做到: 1.分區控制。把大的數據拆成一小份一小份的(分區,分片)讓多臺設備同時計算…

一文理清人工智能,機器學習,深度學習的概念

目錄 一、人工智能的起源與核心范疇(1950-1980) 1.1 智能機器的最初構想 1.2 核心范疇的初步分化 二、機器學習的興起與技術分化(1980-2010) 2.1 統計學習的黃金時代 2.2 神經網絡的復興與子集定位 2.3 技術生態的形成與AI…

《Effective Python》第1章 Pythonic 思維總結——編寫優雅、高效的 Python 代碼

《Effective Python》第1章 Pythonic 思維總結——編寫優雅、高效的 Python 代碼 在編程的世界里,每個語言都有其獨特的風格和最佳實踐。對于 Python 而言,“Pythonic”已經成為描述遵循 Python 特定風格的代碼的代名詞。這種風格不僅讓代碼更易讀、更簡…

MySQL 事務(二)

文章目錄 事務隔離性理論理解隔離性隔離級別 事務隔離級別的設置和查看事務隔離級別讀未提交讀提交(不可重復讀) 事務隔離性理論 理解隔離性 MySQL服務可能會同時被多個客戶端進程(線程)訪問,訪問的方式以事務方式進行一個事務可能由多條SQL…

代碼倉提交分支規范

以下是我部門開發時用的分支規范,參考于Linux社區 Tips 分支命名通常遵循一些最佳實踐和規則,以便使分支的用途和內容清晰易懂,就在寫一個文檔的主題一樣。 功能分支 (Feature Branches) 用于開發新功能。 命名格式:feature/功能名…

Google Earth Engine(GEE) 代碼詳解:批量計算_年 NDVI 并導出(附 Landsat 8 數據處理全流程)

一、代碼整體目標 基于 Landsat 8 衛星數據,批量計算 2013-2020 年研究區的 NDVI(歸一化植被指數),實現去云處理、數據合成、可視化及批量導出為 GeoTIFF 格式,適用于植被動態監測、生態環境評估等場景。 二、代碼分步解析(含核心原理與易錯點) 1. 加載并顯示研究區邊…

Maven 處理依賴沖突

Maven處理依賴沖突 什么是依賴沖突?如何解決?Maven自動處理依賴沖突的規則路徑優先原則第一聲明優先原則注意 子模塊覆蓋父模塊父模塊聲明dependency子模塊覆蓋dependency父模塊聲明dependencyManagement 子模塊覆蓋dependency父模塊聲明dependencyManag…

docker 安裝 sqlserver2022 和注意點

一、前言 1、可以直接參考微軟官方文檔 快速入門:使用 Docker 運行 SQL Server Linux 容器映像,這里主要是說一些注意點和坑 二、安裝 1、拉取鏡像 docker pull mcr.microsoft.com/mssql/server:2022-latest2、創建掛載目錄,這里只是比官方…

Dagster Pipes系列-1:調用外部Python腳本

本文是"Dagster Pipes教程"的第一部分,介紹如何通過Dagster資產調用外部Python腳本并集成到數據管道中。首先,創建Dagster資產subprocess_asset,利用PipesSubprocessClient資源執行外部腳本external_code.py,實現跨進程…

【SQL系列】多表關聯更新

💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

C++進階學習:STL常用容器--map/multimap容器

1. map 容器基本概念 map 中所有元素都是 pair pair 中第一個元素為 key (鍵值) 起到索引運用 第二個元素為 value(實值) 所有元素都會根據元素的鍵值自動排序 本質: map/multimap 屬于關聯式容器 底層結構是用二…

let,const,var關鍵字的區別

let,const,var關鍵字 let,const,var都存在變量提升 它們都存在變量提升但是稍微有點不同 var變量聲明會被提升到作用域的頂部,并且會被初始化為 undefinedlet 和 const:變量聲明也會被提升到作用域的頂部,但不會被初…

Nuitka 已經不再安全? Nuitka/Cython 打包應用逆向工具 -- pymodhook

pymodhook是一個記錄任意對Python模塊的調用的庫,用于Python逆向分析。 pymodhook庫類似于Android的xposed框架,但不僅能記錄函數的調用參數和返回值,還能記錄模塊的類的任意方法調用,以及任意派生對象的訪問,基于pyob…

path環境變量滿了如何處理,分割 PATH 到 Path1 和 Path2

要正確設置 Path1 的值,你需要將現有的 PATH 環境變量 中的部分路徑復制到 Path1 和 Path2 中。以下是詳細步驟: 步驟 1:獲取當前 PATH 的值 打開環境變量窗口: 按 Win R,輸入 sysdm.cpl,點擊 確定。在 系…

SEMI E40-0200 STANDARD FOR PROCESSING MANAGEMENT(加工管理標準)-(一)

1 目的 物料(例如晶圓)加工在設備中的自動化管理與控制是實現工廠自動化的關鍵要素。本標準針對半導體制造環境中與設備內部物料處理相關的通信需求進行了規范。本標準規定了在加工單元接收到的指定材料所應適用的加工方法(例如Etch腔室需要Run哪支Recipe)。它闡述了物料加工的…

【Hadoop】集群搭建實戰:超詳細保姆級教程

🐇明明跟你說過:個人主頁 🏅個人專欄:《大數據前沿:技術與應用并進》🏅 🔖行路有良友,便是天堂🔖 目錄 一、引言 1、Hadoop簡介 2、Hadoop集群概念 3、 Hadoop 集…

阿里云人工智能大模型通義千問Qwen3開發部署

本文主要描述阿里云人工智能大模型開源社區ModelScope提供的通義千問Qwen3開發部署。 與阿里云一起 輕松實現數智化 讓算力成為公共服務:用大規模的通用計算,幫助客戶做從前不能做的事情,做從前做不到的規模。讓數據成為生產資料:…

24.(vue3.x+vite)引入組件并動態掛載(mount)

示例截圖 組件代碼: <template><div><div>{{message }}</div>