C語言(07)——原碼 補碼 反碼 (超絕詳細解釋)

本文的內容通下面這篇文章有著緊密的聯系,讀者可以選擇性閱讀?

C語言————二、八、十、十六進制的相互轉換-CSDN博客

相關的C語言練習題和思維鍛煉可以參考以下文章

C語言————練習題冊(答案版)-CSDN博客

C語言————斐波那契數列的理解和運用-CSDN博客

目錄

基本概念

原碼?反碼 補碼 轉換

數據的存儲方式

基本存儲單位

數據的計算方式

補碼的模運算原理?

模運算和取余運算

移位操作符

左移操作符

右移操作符

位操作符:&、|、^、~

&的運算規則

|的運算規則

^的運算規則

~的運算規則


基本概念

我們知道不同進制的數字,歸根結底都是一個個不同的表現形式?。

原碼、補碼和反碼是整數類型在計算機內部以二進制存儲時的三種不同表現形式,雖然整數具有這三種類型的存儲方式,但是在內存中以補碼的形式進行存儲。

有符號整數在這三種方法中均由符號位數值位兩部分組成,在二進制序列中,最高的一位被視為符號位,其余都是數值位。

下面我們對這三種方式進行逐一介紹:

原碼:直接將數字按照二進制轉換方法得到的就是原碼

反碼:符號位不變,其余位依次取反得到的就是反碼

補碼:反碼+1得到的就是補碼

:知道一個負整數的補碼或者反碼,想求這個負整數的值,那么應該將補碼或者反碼逆推回去得到原碼,再由原碼進行計算得到的值才是正確的,在計算中,符號位不參與權重,僅用以判斷正負。

正整數的原碼、反碼、補碼都相同;

原碼?反碼 補碼 轉換

負整數的原碼、反碼、補碼有如下的轉換形式(轉換中符號位不變):

在對這三種形式運用的深入之前,我們先進行一個前置的知識儲備。?

數據的存儲方式

我們知道,計算機內部采用二進制存儲所有數據,原因是電子元件(如晶體管)的 “導通” 與 “截止” 兩種狀態可直接對應二進制的 “1” 和 “0”,物理實現簡單且穩定。

基本存儲單位

我們知道一個int的字節大小為4,那么他的二進制位數為32位,接下來我們會用int來介紹三種碼之間的運用方式。

數據的計算方式

在計算機中,數據的計算和存儲都是通過補碼來完成的。這是因為使用補碼可以對符號位和數值域進行統一的處理,同時加減法也可以進行統一處理(CPU處理器只有加法器),此外,原碼和補碼的相互轉換,二者的方式是相同的,也不需要額外的電子元件。

那為什么使用補碼而不是原碼呢?

原碼是利用最高位表示符號(0 代表正數,1 代表負數),其余位表示數值的絕對值。不過,原碼在進行加減法運算時會碰到一些難題:

  • 符號位處理復雜:在進行加減法運算時,需要先判斷操作數的符號,然后再決定是進行加法還是減法運算。
  • 存在正負零:原碼中存在兩種零的表示方式,即+0(0000)和-0(1000),這會使比較操作變得復雜。
  • 減法運算困難:當進行減法運算時,需要設計專門的電路來執行減法操作,這增加了硬件的復雜度。

補碼是通過對原碼取反后加 1 得到的,它成功解決了原碼存在的上述問題。

  • 統一加減法運算:在補碼系統中,減法可以轉換為加法來進行計算,比如A - B可以表示為A + (-B)。這樣一來,計算機就不需要設計專門的減法電路,只需一個加法器就能完成加減法運算。
  • 消除正負零:在補碼表示中,零只有一種表示形式,即0000。而1000則被用來表示-8,這使得數值的表示范圍得到了擴展。(+0和-0的補碼結果時一致的,所以只有一種表示形式
  • 簡化硬件設計:由于加減法運算可以統一用加法器來實現,硬件設計變得更加簡單,同時還能減少出錯的概率。
    int main()
    {//1 - 1//1 + (-1)//00000000000000000000000000000001 ---- 1的原碼//00000000000000000000000000000001 ---- 1的補碼//00000000000000000000000000000001 ---- 1的反碼//10000000000000000000000000000001 ---- -1的原碼//11111111111111111111111111111110 ---- -1的反碼//11111111111111111111111111111111 ---- -1的補碼//那么我們用原碼進行計算時我們可以得到值為10000000000000000000000000000010  即-2,與結果不符//我們使用補碼進行計算時可以得到00000000000000000000000000000000    即0,數值相符return 0;
    }

    通過上述代碼,我們發現,使用原碼進行計算時(相當于沒有考慮正負符號直接求和),得到的結果與值不符,而補碼計算時完美的彌補了他的不足。

補碼的模運算原理?

補碼其實是一種模運算系統。對于 n 位二進制數,其模為 2?。例如,4 位二進制數的模就是 16。在模運算中,減去一個數就相當于加上這個數的補數,即x - y ≡ x + (2? - y) (mod 2?)

以 4 位二進制數計算5 - 3為例:

  • 可以轉化為5 + (-3)

  • -3的補碼為1101(也就是16 - 3 = 13

  • 計算5 + 13 = 18,由于模為 16,18 mod 16 = 2,結果正確。

另,整數值和其補碼對應的值由如下對應關系:

  • 正數:直接表示為二進制,范圍是?0?到?2^(n-1)-1

  • 負數-N?表示為?2^n - N,范圍是?-2^(n-1)?到?-1

    例如,4 位補碼的模是?16

  • -5?表示為?16 - 5 = 11(二進制?1011)。{取反+1得到1101即-5}

  • -8?表示為?16 - 8 = 8(二進制?1000)。{取反+1得到0000,這是錯誤的示范,8在4位二進制無法用原碼表示,進一步體現了原碼的局限性}

模運算和取余運算

在數學中,模運算表示兩個數相除之后的余數,但他的結果符號和除數(分母)一致;而取余運算中的結果符號與被除數(分子)一致。

  • 模運算:在數論中,對于給定的兩個整數?a(被除數)和?m(模,且?m>0),模運算的結果?r?是使得?a=q×m+r?成立的非負整數,其中?q?是商,并且?0≤r<m?。它強調的是在一個以?m?為周期的循環系統中的位置 。

  • 取余運算:取余是求兩個數相除后的余數。對于整數?a?和?b(b!=0),取余運算得到的結果?r?滿足?a=q×b+r?,其中?q?是商,?r?的符號與被除數?a?的符號相同,并且?∣r∣<∣b∣?。

:兩種計算對商的值處理分別為:模運算向下取整,取余運算向零取整

移位操作符

<< 為左移位操作符

>> 為右移位操作符

:他們的操作數都只能是整數,有且僅有兩個操作數,只能移動非負數位

左移操作符

移動規則:左邊拋棄,右邊補0

對于 10 << 1 ,他的具體變化如下:

#include <stdio.h>
int main()
{int num = 10;int n = num<<1;printf("n= %d\n", n);//變成20printf("num= %d\n", num);//num不變,即不改變num自身的值return 0;
}

右移操作符

右移操作符具有兩種不同的移動規則:

1.算術右移:左邊用原該值的符號位填充,右邊丟棄

2.邏輯右移:左邊用0填充,右邊丟棄

對于-10 >> 1,采用算術右移變化如下:

對于-10 >> 1,采用邏輯右移變化如下:

#include <stdio.h>
int main()
{int num = -10;int n = num>>1;printf("n= %d\n", n);//變成-5printf("num= %d\n", num);//num不變,即不改變num自身的值return 0;
}

在實際運算中,>>右移操作符采用算術右移還是邏輯右移,取決于編輯器規則;但一般情況下采用的是算術右移。?

位操作符:&、|、^、~

位操作符有:?

& ———— 按位與
|??———— 按位或
^ ———— 按位異或
~ ———— 按位取反
:他們的操作數必須是整數
&的運算規則
以兩個整數的補碼進行計算,對應的二進制位上,有0就為0同時為1才為1
|的運算規則

以兩個整數的補碼進行計算,對應的二進制位上,有1就為1同時為0才為0

^的運算規則

以兩個整數的補碼進行計算,對應的二進制位上,相同為0相異為1

~的運算規則

根據取反的規則,對整數的補碼進行取反運算

———————————————————————————————————————————

后續會更新針對于二進制數的相關操作符

有表述不當的地方辛苦大家指出,三克油。

打怪升級中................................................................................................................................................

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

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

相關文章

磁盤壞道檢測工具在美國服務器硬件維護中的使用規范

磁盤壞道檢測工具在美國服務器硬件維護中的使用規范在服務器硬件維護領域&#xff0c;磁盤壞道檢測工具是保障數據安全的第一道防線。本文將系統介紹美國數據中心環境下專業級磁盤診斷方案的實施標準&#xff0c;重點解析SMART檢測、壞道修復算法與自動化運維流程的整合方法&am…

【n8n】如何跟著AI學習n8n【03】:HTTPRequest節點、Webhook節點、SMTP節點、mysql節點

前言 n8n的系統性學習&#xff0c;對各知識點地毯式學習&#x1f50d;~ 前面課程 定制n8n的AI老師&#xff0c;有AI老師制定學習大綱&#xff0c;參考之前的文檔&#xff08;本系列n8n學習大綱&#xff0c;也在這里&#xff09;&#xff1a; 【n8n】如何跟著AI學習n8n_01&a…

Vue 的雙向數據綁定原理

Vue 的雙向數據綁定是通過 數據劫持 發布-訂閱模式 實現的&#xff0c;具體分為以下三個關鍵機制&#xff1a;1. 數據劫持&#xff08;響應式系統&#xff09; Vue 使用 Object.defineProperty&#xff08;Vue 2&#xff09;或 Proxy&#xff08;Vue 3&#xff09;監聽數據變化…

【基于C# + HALCON的工業視覺系統開發實戰】三十五、金屬表面劃傷檢測:強反光場景解決方案

摘要:針對金屬表面強反光導致劃傷檢測準確率低的行業痛點,本文提出基于光度立體法的工業視覺檢測方案。系統采用“硬件抗反光+算法重建”雙策略,硬件上通過可編程分區環形光源、偏振鏡頭與高動態相機構建成像系統;算法上利用四方向光源序列圖像重建表面法向量與高度場,實現…

為什么bert是雙向transformer

BERT 是雙向 Transformer&#xff0c;這是它的一個核心創新點。下面我從 技術原理、與傳統 Transformer 的區別、以及雙向性的實際意義 來詳細解釋為什么 BERT 被稱為“雙向 Transformer”。一、什么是 BERT 的“雙向”&#xff1f;在 BERT 的論文中&#xff0c;雙向的原文是 &…

vue中使用Canvas繪制波形圖和頻譜圖(支持.pcm)

實現方式一&#xff1a; vue中使用wavesurfer.js繪制波形圖和頻譜圖 安裝colorMap&#xff1a; npm install --save colormap1、單個頻譜圖 效果&#xff1a; 源碼&#xff1a; <template><div class"spectrogram-container"><canvas ref"ca…

【Python系列】Flask 應用中的主動垃圾回收

博客目錄一、Python 內存管理基礎二、Flask 中手動觸發 GC 的基本方法三、高級 GC 策略實現1. 使用裝飾器進行請求級別的 GC2. 定期 GC 的實現四、Flask 特有的 GC 集成方式1. 使用 teardown_request 鉤子2. 結合應用上下文管理五、智能 GC 策略六、注意事項與最佳實踐七、替代…

Linux和shell

最快入門的方式是使用蘋果系統。此外&#xff0c;累計補充學習&#xff1a;一、目錄結構/bin&#xff0c;二進制文件 /boot&#xff0c;啟動文件 /dev&#xff0c;設備文件 /home&#xff0c;主目錄&#xff0c;一般外接包、安裝包放在這里 /lib&#xff0c;庫文件 /opt&#x…

告別內存泄漏:你的Rust語言30天征服計劃

歡迎踏上Rust學習之旅&#xff01;第一周&#xff1a;奠定基礎 (Week 1: Laying the Foundation)第1天&#xff1a;環境搭建與 “Hello, World!”核心概念: 安裝Rust工具鏈 (rustup)&#xff0c;它包含了編譯器rustc和包管理器Cargo。Cargo是你的好朋友&#xff0c;用于創建項目…

亂刪文件,電腦不能開機,怎么辦

相信不少朋友在清理電腦、釋放空間時&#xff0c;都做過一件“后悔一整年”的事——亂刪系統文件。本來只是想讓電腦快點、干凈點&#xff0c;結果第二天一開機&#xff1a;黑屏了、藍屏了、無限重啟了&#xff0c;甚至連桌面都見不到了&#xff01;很多用戶在刪文件時&#xf…

ICODE SLIX2有密鑰保護的物流跟蹤、圖書館管理ISO15693標簽讀寫Delphi源碼

本示例使用設備&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.6781645eXF3tm5&ftt&id959258149468 一、密鑰認證 procedure TForm1.Button21Click(Sender: TObject); varctrlword:byte;passwordid:byte; //密鑰類型status:byte; //存…

核環境特種機器人設備的抗輻照芯片選型方案

摘要&#xff1a;核能作為國家能源安全的重要組成部分&#xff0c;對工業自動化設備的穩定性和可靠性提出了極高的要求。機器人設備在涉核環境下的日常巡檢、設備維護、應急響應等任務中發揮著不可替代的作用。然而&#xff0c;涉核環境&#xff0c;尤其是高能粒子的輻照效應&a…

Linux權限系統完全指南:從本質到安全實踐

一、權限的本質&#xff1a;Linux安全的核心邏輯在Linux的多用戶環境中&#xff0c;權限系統通過三個關鍵維度實現資源隔離&#xff1a;用戶標識 (UID)&#xff1a;系統通過數字ID識別用戶&#xff0c;root用戶的UID固定為0組標識 (GID)&#xff1a;用戶組機制實現批量權限管理…

養老院跌倒漏報率↓78%!陌訊多模態算法在智慧照護中的邊緣計算優化

?摘要??&#xff1a; 針對養老場景中復雜光照與遮擋導致的跌倒漏報問題&#xff0c;陌訊視覺算法通過多模態融合與邊緣計算優化&#xff0c;實測顯示在RK3588 NPU硬件上實現??mAP0.5達89.3%??&#xff0c;較基線模型提升28.5%&#xff0c;功耗降低至7.2W。本文解析其動態…

老年護理實訓室建設方案:打造安全、規范、高效的實踐教學核心平臺

在老齡化社會加速發展的背景下&#xff0c;培養高素質、技能過硬的老年護理專業人才迫在眉睫。一個設計科學、功能完備的老年護理實訓室&#xff0c;正是院校提升實踐教學質量&#xff0c;對接行業需求的核心平臺。本方案旨在構建一個安全、規范、高效的現代化實訓環境。點擊獲…

OpenCv中的 KNN 算法實現手寫數字的識別

目錄 一.案例&#xff1a;手寫數字的識別 1.安裝opencv-python庫 2.將大圖分割成10050個小圖&#xff0c;每份對應一個手寫數字樣品 3.訓練集和測試集 4.為訓練集和測試集準備結果標簽 5.模型訓練與預測 6.計算準確率 7.完整代碼實現 一.案例&#xff1a;手寫數字的識別…

TCP/IP 傳輸層詳解

TCP/IP 傳輸層詳解 傳輸層&#xff08;Transport Layer&#xff09;是 TCP/IP 模型的第四層&#xff08;對應 OSI 模型的傳輸層&#xff09;&#xff0c;核心功能是實現 端到端&#xff08;進程到進程&#xff09;的可靠通信。主要協議包括&#xff1a; TCP&#xff08;傳輸控制…

深度學習筆記:Overview

本文根據吳恩達老師的深度學習課程整理而來&#xff0c;在此表示感知。 文章目錄1.課程筆記2.編程作業1.課程筆記 1&#xff09;深度學習筆記&#xff08;1&#xff09;&#xff1a;神經網絡基礎 2&#xff09;深度學習筆記&#xff08;2&#xff09;&#xff1a;淺層神經網絡…

LLM之RAG理論(十八)| ChatGPT DeepResearch 深度研究功能全面技術分析報告

一、背景與行業環境1.1 DeepResearch 的誕生與戰略意義ChatGPT DeepResearch&#xff08;深度研究&#xff09;是 OpenAI 于 2025 年 2 月 3 日正式發布的全新 AI 智能體產品&#xff0c;是繼 o3-mini 模型發布后&#xff0c;OpenAI 在 AI 研究領域的又一重大突破。這一功能的推…