C語言中整數編碼方式(原碼、反碼、補碼)

在 C 語言中,原碼、反碼、補碼的運算規則與其編碼特性密切相關,核心差異體現在符號位是否參與運算、進位如何處理以及減法是否能轉化為加法等方面。以下是三者的運算規則及特點分析(以 8 位整數為例,符號位為最高位):

一、原碼的運算規則

原碼是 “符號位 + 數值絕對值” 的直接表示,其運算規則需單獨處理符號位,且加法和減法需分開邏輯,靈活性差。

1. 加法運算
  • 若兩數符號相同(同正或同負):

符號位不變(仍為 0 或 1),數值位直接相加;若數值位相加后有進位,結果可能溢出(超出表示范圍)。

示例:+3(00000011) + +5(00000101)

符號位均為 0,數值位相加:0000101 + 000011 = 0001000,結果為00001000(+8,正確)。

  • 若兩數符號不同(一正一負):

需先比較兩數數值位的絕對值大小,用 “大絕對值 - 小絕對值”,結果的符號取 “絕對值大的數” 的符號。

示例:+5(00000101) + (-3)(10000011)

絕對值 5 > 3,符號取正(0),數值位相減:0000101 - 0000011 = 0000010,結果為00000010(+2,正確)。

2. 減法運算

原碼減法需轉化為 “被減數 + 減數的相反數”,再按加法規則處理(符號相反時的加法邏輯)。

示例:+5(00000101) - (+3)(00000011)

等價于 +5 + (-3),按符號不同的加法規則計算,結果為 + 2(正確)。

原碼運算的缺陷
  • 符號位需單獨判斷,運算邏輯復雜(需比較絕對值、區分加減);
  • 存在兩個 0(+0 和 - 0),可能導致運算結果歧義;
  • 實際中幾乎不用于計算機運算(僅用于直觀表示)。

二、反碼的運算規則

反碼是原碼到補碼的過渡編碼,其運算規則允許符號位參與運算,但需處理 “循環進位”(最高位進位需回加到最低位),可實現減法轉加法,但仍有缺陷。

1. 加法運算
  • 符號位與數值位一起參與加法(按二進制加法規則,逢 2 進 1);
  • 若最高位(符號位)產生進位,需將該進位 “循環” 加到結果的最低位(稱為 “循環進位”);
  • 運算結果仍為反碼,需轉換為原碼才能得到實際值。

示例 1:+3(反碼00000011) + +5(反碼00000101)

直接相加:00000011 + 00000101 = 00001000(無進位),結果反碼為 00001000,對應原碼 + 8(正確)。

示例 2:+5(反碼00000101) + (-3)(反碼11111100)

相加:00000101 + 11111100 = 100000001(最高位產生進位 1);

循環進位:將進位 1 加到最低位,00000001 + 1 = 00000010;

結果反碼為 00000010,對應原碼 + 2(正確)。

示例 3:+1(反碼00000001) + (-1)(反碼11111110)

相加:00000001 + 11111110 = 11111111(無進位);

結果反碼為 11111111,對應原碼 - 0(存在雙 0 問題,不完美)。

2. 減法運算

反碼減法可直接轉化為 “被減數 + 減數的反碼”(因負數的反碼是其相反數的反碼),再按加法規則處理(含循環進位)。

示例:+5 - (+3) 等價于 +5 + (-3),同上述示例 2,結果正確。

反碼運算的缺陷
  • 需處理循環進位,硬件實現稍復雜;
  • 仍存在 - 0(11111111),導致 0 的表示不唯一;
  • 未徹底解決運算問題,僅作為補碼的過渡。

三、補碼的運算規則

補碼是計算機中實際使用的編碼,其運算規則最簡單:符號位直接參與運算,進位直接丟棄,減法可完美轉化為加法,且結果唯一正確。

1. 加法運算
  • 符號位與數值位一起參與加法(按二進制加法規則,逢 2 進 1);
  • 若最高位(符號位)產生進位,直接丟棄該進位(因超出位數的部分不影響結果);
  • 運算結果仍為補碼,無需額外處理即可表示正確值。

示例 1:+3(補碼00000011) + +5(補碼00000101)

相加:00000011 + 00000101 = 00001000(無進位),結果補碼為 00001000,對應 + 8(正確)。

示例 2:+5(補碼00000101) + (-3)(補碼11111101)

相加:00000101 + 11111101 = 100000010(最高位產生進位 1);

丟棄進位:結果為 00000010,對應 + 2(正確)。

示例 3:+1(補碼00000001) + (-1)(補碼11111111)

相加:00000001 + 11111111 = 100000000(進位 1);

丟棄進位:結果為 00000000(唯一的 0,正確)。

2. 減法運算

補碼減法可直接轉化為 “被減數 + 減數的補碼”(因減去一個數 = 加上它的相反數,而負數的補碼是其相反數的補碼),再按加法規則處理(進位丟棄)。

公式:a - b = a + (-b)的補碼

示例:+5 - (+3) = +5 + (-3)的補碼

-3 的補碼為 11111101,相加結果同示例 2,得 + 2(正確)。

補碼運算的優勢
  • 符號位自然參與運算,無需單獨判斷;
  • 減法完全轉化為加法,簡化硬件設計(只需加法器);
  • 只有一個 0(00000000),結果無歧義;
  • 進位直接丟棄,邏輯簡單,是計算機中整數運算的唯一實現方式。

四、無符號數的運算規則

無符號數(unsigned)沒有符號位,其原碼、反碼、補碼完全相同(即二進制數值本身),運算規則為:

  • 加法:按二進制加法,進位直接丟棄(超出位數的部分無效);
  • 減法:按二進制減法,若被減數小于減數,結果為 “模” 減去(減數 - 被減數)(等價于補碼運算,因無符號數的補碼即自身)。

示例(8 位無符號數):5 - 10

等價于 5 + (256 - 10) = 5 + 246 = 251(因 8 位無符號數的模為 256),結果為 251(正確,無符號數減法的 “借位” 通過模運算處理)。

總結

編碼

加法規則

減法規則

核心特點

原碼

符號位單獨處理,異號需比較絕對值

轉化為 “被減數 + 相反數”,同加法

邏輯復雜,有雙 0,幾乎不用

反碼

符號位參與運算,進位循環到最低位

轉化為 “被減數 + 減數的反碼”

需循環進位,仍有 - 0,過渡編碼

補碼

符號位參與運算,進位直接丟棄

轉化為 “被減數 + 減數的補碼”

邏輯簡單,無歧義,計算機實際使用

補碼的運算規則是 C 語言中整數存儲和運算的基礎,理解其規則可解釋負數運算、溢出(如int a = 127 + 1結果為 - 128)等現象。

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

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

相關文章

js二維數組如何變為一維數組

在 JavaScript 中,將二維數組轉換為一維數組(扁平化)有多種方法,可根據數組結構復雜度、性能需求和兼容性選擇。以下是最常用的實現方式: 1. 使用 flat() 方法(ES2019) MDN釋義:flat…

Claude code在Windows上的配置流程

前言 昨天在服務器上配置好了 Claude code,發現其編碼性能和效率都非常不錯。 然而,嘗試用它修改帶 UI 界面的客戶端程序時頗為不便,因為服務器沒有圖形化界面,無法直接將應用界面直接顯示到開發機上,調試起來頗為不…

手把手教你用YOLOv10打造智能垃圾檢測系統

無需編程基礎!手把手教你用YOLOv10打造智能垃圾檢測系統 垃圾分類不再難,AI助手秒識別 你是否曾站在分類垃圾桶前猶豫不決?塑料瓶是可回收還是其他垃圾?外賣餐盒到底該丟哪里?隨著垃圾分類政策推廣,這樣的困…

batchnorm類

1. 偽代碼:2. python代碼:3. 測試:4. 加深理解:以 為例,x3,可見輸出的batchnorm后y0.2627.查看模型記錄的均值及方差,計算y0.286799,理解是大致這樣的計算過程。(為什么數…

SpringBoot項目保證接口冪等的五種方法!

1. 冪等概述 1.1 深入理解冪等性 在計算機領域中,冪等(Idempotence)是指任意一個操作的多次執行總是能獲得相同的結果,不會對系統狀態產生額外影響。在Java后端開發中,冪等性的實現通常通過確保方法或服務調用的結果…

SQL新手入門詳細教程和應用實例

SQL(Structured Query Language)是用于管理和操作關系型數據庫的標準語言。它允許你創建、查詢、更新和刪除數據。本教程將從基礎概念開始,逐步引導你上手SQL,并提供詳細的應用實例。教程基于標準SQL語法,實際使用時需根據數據庫系統(如MySQL、SQLite或PostgreSQL)調整。…

DVWA-LOW級-SQL手工注入漏洞測試(MySQL數據庫)+sqlmap自動化注入-小白必看(超詳細)

首次使用DVWA的靶場,咋們先從最低級別的LOW開始,因為之前玩過一下墨者學院,對sql注入有一點認識和理解,所以先從sql的盲注開始; 1、測試注入點是否存在sql注入的漏洞; (1)首先我們…

JAVA線程池詳解+學習筆記

1.線程池基礎概念線程池是一種資源復用技術,通過預先創建并管理一組線程,減少頻繁創建和銷毀線程的開銷。核心思想與數據庫連接池、字符串常量池類似,旨在提升系統性能。核心參數解析ThreadPoolExecutor構造函數包含7個關鍵參數:c…

數據分析庫 Pandas

對于Pandas的簡單認識和基本操作的練習一 介紹 Pandas 是一個開源的數據分析和數據處理庫,它是基于 Python 編程語言的庫。 Pandas 提供了易于使用的數據結構和數據分析工具,特別適用于處理結構化數據,如表格型數據(類似于 Excel …

qt 中不要讓 lambda 槽函數捕獲信號源對象的共享指針

錯誤示例std::shared_ptr<QSerialPort> serial{new QSerialPort{}};QSerialPort::connect(serial.get(),&QSerialPort::readyRead,[serial](){QByteArray receive_data serial->readAll();std::cout.write(receive_data.data(), receive_data.size());});這會直接…

Solidity 合約的編寫-完整開發流程:從編譯、測試、部署到交互

&#x1f9f1; Solidity 合約開發全流程&#xff08;Foundry 版&#xff09;? 適合對象&#xff1a;已經能寫合約但不清楚如何測試、部署、交互的開發者? 工具鏈&#xff1a;Foundry&#xff08;forge, anvil, cast&#xff09;&#x1f4cc; 開發流程總覽1?? 初始化項目 2…

設計模式 - 面向對象原則:SOLID最佳實踐

文章目錄深入理解 SOLID&#xff1a;用對原則&#xff0c;別把簡單問題搞復雜SOLID 原則概覽1. 單一職責原則&#xff08;SRP&#xff09;2. 開閉原則&#xff08;OCP&#xff09;3. 里氏替換原則&#xff08;LSP&#xff09;4. 接口隔離原則&#xff08;ISP&#xff09;5. 依賴…

Vue 3 中父組件內兩個子組件相互傳參的幾種方法

方法一&#xff1a;通過父組件中轉&#xff08;Props Emits&#xff09;<!-- ParentComponent.vue --> <template><ChildA :message-from-b"messageFromB" send-to-b"handleSendToB" /><ChildB :message-from-a"messageFromA&q…

三子棋游戲設計與實現(C 語言版)

一、需求分析目標&#xff1a;實現一個簡單的人機對戰三子棋&#xff0c;支持以下功能&#xff1a;初始化空棋盤&#xff0c;清晰展示落子狀態。玩家通過坐標落子&#xff08;X 代表玩家&#xff09;&#xff0c;電腦隨機落子&#xff08;O 代表電腦&#xff09;。實時判斷勝負…

GD32 CAN1和TIMER0同時開啟問題

背景&#xff1a;今天在一個項目調試的時候發現了一些問題&#xff0c;由此貼記錄一下問題解決的過程。使用的芯片是GD32F305VE。使用到了CAN1和TIMER0。在使用這連個外設的時候發送了一些問題。單獨使用CAN1。功能正常。單獨使用TIMER0。配置為輸出模式。功能正常。但是當兩個…

劍指offer56_數組中唯一只出現一次的數字

數組中唯一只出現一次的數字在一個數組中除了一個數字只出現一次之外&#xff0c;其他數字都出現了三次。 請找出那個只出現一次的數字。 你可以假設滿足條件的數字一定存在。 思考題&#xff1a; 如果要求只使用 O(n) 的時間和額外 O(1) 的空間&#xff0c;該怎么做呢&#xf…

從語音識別到智能助手:Voice Agent 的技術進化與交互變革丨Voice Agent 學習筆記

From Research AI&#xff1a; 最近看到 Andrew Ng 的一句話讓我印象深刻&#xff1a;“While some things in AI are overhyped, voice applications seem underhyped right now.”&#xff08;盡管 AI 中有些領域被過度炒作&#xff0c;語音應用卻似乎被低估了&#xff09;。…

什么是Jaccard 相似度(Jaccard Similarity)

文章目錄? 定義&#xff1a;&#x1f4cc; 取值范圍&#xff1a;&#x1f50d; 舉例說明&#xff1a;&#x1f9e0; 應用場景&#xff1a;?? 局限性&#xff1a;&#x1f4a1; 擴展概念&#xff1a;Jaccard 相似度&#xff08;Jaccard Similarity&#xff09; 是一種用于衡量…

ragflow_多模態文檔解析與正文提取策略

多模態文檔解析與正文提取策略 RAGflow的文檔解析系統位于deepdoc/parser/目錄下,實現了對多種文檔格式的統一解析處理。該系統采用模塊化設計,針對不同文檔格式提供專門的解析器,并通過視覺識別技術增強解析能力。本文將深入探討RAGflow的文檔解析系統的設計原理、實現細節…

數據結構棧的實現(C語言)

棧的基本概念棧是一種特殊的線性存儲結構&#xff0c;是一種操作受到限制的線性表&#xff0c;特殊體現在兩個地方&#xff1a;1、元素進棧出棧的操作只能從同一端完成&#xff0c;另一端是封閉的&#xff0c;通常將數據進棧叫做入棧&#xff0c;壓棧等&#xff0c;出棧叫做彈棧…