C語言————原碼 補碼 反碼 (日漸清晰版)

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

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位二進制無法用原碼表示,進一步體現了原碼的局限性}

移位操作符

<< 為左移位操作符

>> 為右移位操作符

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

左移操作符

移動規則:左邊拋棄,右邊補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/92832.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92832.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92832.shtml

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

相關文章

函數-變量的作用域和生命周期

變量的作用域 引入問題 我們在函數設計的過程中&#xff0c;經常要考慮對于參數的設計&#xff0c;換句話說&#xff0c;我們需要考慮函數需要幾個參數&#xff0c;需要什么類型的參數&#xff0c;但我們并沒有考慮函數是否需要提供參數&#xff0c;如果說函數可以訪問到已定義…

Ansible在配置管理中的應用

Ansible是一個開源的配置管理和應用程序部署工具&#xff0c;它使用YAML語言編寫的Playbook來描述配置和應用部署過程。通過SSH協議與目標機器通信&#xff0c;Ansible可以實現批量操作&#xff0c;極大地提升了工作效率。核心功能Ansible的核心功能包括&#xff1a;配置管理&a…

【學習路線】Go語言云原生開發之路:從簡潔語法到微服務架構

一、Go語言基礎入門&#xff08;1-2個月&#xff09; &#xff08;一&#xff09;環境搭建與工具鏈Go環境安裝 官方安裝&#xff1a;從golang.org下載安裝包版本管理&#xff1a;g、gvm等Go版本管理工具環境變量&#xff1a;GOROOT、GOPATH、GOPROXY配置Go Modules&#xff1a;…

軟件工廠:推動新質生產力的組織躍遷

引言&#xff1a;軟件工廠的建設&#xff0c;不在于工具多&#xff0c;而在于理解深&#xff1b;不在于上線快&#xff0c;而在于體系穩。不僅是“看得見的流水線”&#xff0c;更是“看不見的組織變革”。在新質生產力的時代命題下&#xff0c;軟件工廠正成為連接創新與效率、…

9.0% 年增速驅動!全球自清潔滾輪拖布機器人市場2031年將邁向 946 百萬美元

自清潔滾輪拖布機器人是重要的智能清潔設備&#xff0c;采用滾筒式拖布結構&#xff0c;集掃拖功能&#xff0c;通過高速旋轉加壓擦洗地面&#xff0c;深度除污。其活水清潔系統可實時自清潔、回收污水&#xff0c;避免二次污染&#xff0c;提升清潔效率與效果&#xff0c;帶來…

新能源工廠的可視化碳中和實驗:碳足跡追蹤看板與能源調度策略仿真

摘要新能源工廠明明用著風電、光伏等清潔能源&#xff0c;碳排放數據卻依舊居高不下&#xff1f;某鋰電池廠耗費百萬升級設備&#xff0c;碳足跡卻難以精準追蹤&#xff0c;能源調度全靠經驗“拍腦袋”&#xff0c;導致成本飆升。而隔壁企業通過可視化碳中和實驗&#xff0c;碳…

數據結構自學Day13 -- 快速排序--“非遞歸利用棧實現”

一、快速排序回顧 快速排序本質上是**“分而治之”&#xff08;Divide and Conquer&#xff09;策略的遞歸應用。但遞歸其實就是函數棧的一種體現&#xff0c;因此我們也可以顯式使用棧&#xff08;stack&#xff09;來模擬遞歸過程**&#xff0c;從而實現非遞歸版本的快速排序…

前端數據庫:IndexedDB 基礎使用

前言 在現代 Web 開發中&#xff0c;隨著應用程序復雜度的增加&#xff0c;對本地存儲的需求也越來越高。雖然 localStorage 和 sessionStorage 可以滿足一些簡單的數據存儲需求&#xff0c;但當需要存儲大量結構化數據或進行復雜查詢時&#xff0c;它們就顯得力不從心了。這時…

Kubernetes深度解析:企業級容器編排平臺的核心實踐

引言&#xff1a;Kubernetes的戰略地位與核心價值在云原生技術生態中&#xff0c;??Kubernetes??已成為容器編排的事實標準。根據2023年全球云原生調查報告&#xff1a;全球??96%?? 的組織正在使用或評估Kubernetes企業生產環境Kubernetes采用率增長??400%??&#…

Netty中future和promise用法和區別

定義與概念 Future&#xff1a;表示一個異步操作的結果。它是只讀的&#xff0c;意味著你只能查看操作是否完成、是否成功、獲取結果或者異常等信息&#xff0c;但不能主動設置操作的結果。Promise&#xff1a;是 Future 的可寫擴展。它不僅可以像 Future 一樣查看操作結果&…

微算法科技(NASDAQ:MLGO)采用分布式哈希表優化區塊鏈索引結構,提高區塊鏈檢索效率

隨著區塊鏈技術的快速發展&#xff0c;其在各個領域的應用越來越廣泛。然而&#xff0c;區塊鏈數據的存儲和檢索效率問題一直是制約其發展的瓶頸之一。為了解決這一問題&#xff0c;微算法科技(NASDAQ&#xff1a;MLGO)采用了分布式哈希表&#xff08;DHT&#xff09;技術來優化…

Jmeter的元件使用介紹:(三)配置元件詳解01

Jmeter的配置元件有非常多&#xff0c;常用的有&#xff1a;信息頭管理器、Cookie管理器、用戶定義的變量、Http請求默認值、JDBC Connection Configuration、CSV 數據文件設置、計數器等&#xff0c;本文會對這些常用的配置元件一一介紹&#xff0c;還有其他很多配置元件&…

git 連接GitHub倉庫

一、安裝 git 包在官網下載 git 包二、通過SSH密鑰與GitHub遠程倉庫連接1. 檢查本地 SSH 密鑰是否存在ls -al ~/.ssh如果看到 id_rsa 和 id_rsa.pub&#xff0c;說明已有密鑰。2.如果沒有&#xff0c;生成新的 SSH 密鑰&#xff1a;ssh-keygen -t ed25519 -C "your_email…

如何通過AI掃描代碼中的問題

代碼質量其實在需求高壓&#xff0c;業務快速迭代的場景下往往容易被人忽視的問題&#xff0c;大家的編碼習慣和規范也經常會各有喜好&#xff0c;短期之內獲取看不出來什么問題&#xff0c;但長此以往就會發現&#xff0c;屎山逐步成型了&#xff0c;而線上代碼跑著往往就不想…

Java 大視界 -- Java 大數據機器學習模型在金融衍生品市場波動特征挖掘與交易策略創新中的應用(363)

Java 大視界 -- Java 大數據機器學習模型在金融衍生品市場波動特征挖掘與交易策略創新中的應用&#xff08;363&#xff09;引言&#xff1a;正文&#xff1a;一、Java 構建的金融數據處理架構1.1 多源異構數據實時融合1.2 新聞輿情與市場沖擊建模二、Java 驅動的波動特征挖掘與…

Cartographer安裝測試與模塊開發(三)--Cartographer在Gazebo仿真環境下的建圖以及建圖與定位階段問題(實車也可參考)

參數介紹之所以要首先介紹參數而不是實操&#xff0c;是因為大部分建圖失敗、漂移基本上都是參數設置錯誤引起的&#xff0c;或者說大部分都是TF存在問題&#xff0c;主要是坐標系Frame之間有沖突或者對不上等原因導致的&#xff0c;因此把參數放在前面介紹&#xff0c;了解了參…

uniapp nvue開發App 橫豎屏切換丟失上下文導致 setTimeout和clearTimeout報錯

報錯內容如下 [JS Framework] Failed to find taskCenter (35). [JS Framework] Failed to execute the callback function:TypeError: c.clearTimeout is not a function reportJSException >>>> exception function:__WEEX_CALL_JAVASCRIPT__, exception:JavaSc…

Mirauge3D 賦能:全自動建模,讓城市規劃與建筑設計擁有高分辨率實景三維模型

在數字化浪潮席卷各行各業的當下&#xff0c;高精度、多元化的空間數據已成為基礎測繪、智慧城市建設、自然資源管理等領域高質量發展的核心支撐。從城市交通網絡的智能規劃到國土空間的優化配置&#xff0c;從災害監測的精準預警到生態環境保護的科學決策&#xff0c;空間數據…

Javaweb————學習javaweb的預備知識

??????一.javase,javaweb,javaee的區別和聯系 &#x1f499;&#x1f499;&#x1f499;javase: 通俗的來講就是java技術棧&#xff0c;做java相關開發的基礎&#xff0c;比如javaweb&#xff0c;javaee開發都是必備javase的基礎的&#xff0c;包括java語言基礎&#xff…

zabbix服務自動發現、自動注冊及配置釘釘告警(小白的“升級打怪”成長之路)

目錄 一、自動發現及自動注冊 1、自動發現 2、自動注冊規則 二、監控告警并發送電子郵件 1、設定發郵件的地址 2、設定發郵件的用戶 3、設定監控及觸發的條件 4、開始告警并設置觸發發郵件 三、釘釘告警 1、配置zabbix-server 2、配置監控及觸發 3、web頁面操作 4、…