計算機中原碼,反碼,補碼之間的關係

2021-07-26 10:55:03 字數 1473 閱讀 9817

最近在刷c和指標的題目,刷到一題需要補碼的知識,在自己腦子裡面一蒐羅,發現概念已經有些模糊了。剛好播客的申請通過了,就來試試水吧!

我們平時一起共事小夥伴總喜歡開乙個玩笑,我給你一把沙子你給我造一台電腦出來! 想想也確實,計算機的核心元件也就是沙子變來的,難道這就是道家的三生萬物的思想?

呵呵,扯遠了啊。

言歸正傳,沙子可以說組成了計算機的體魄,那計算機的思想,靈魂本質是由什麼組成的呢? 今天的主角來了:二進位制!這篇文章我們不說那些太虛太高大上的東西(實際上我也說不出什麼233)。就簡單說說 數字 在計算機內部是怎麼用二進位制表示的吧。

首先提幾個概念: 原碼,反碼,補碼 

原碼是什麼?

原碼就是早期用來表示數字的一種方式: 乙個正數,轉換為二進位制位就是這個正數的原碼。負數的絕對值轉換成二進位制位然後在高位補1就是這個負數的原碼

舉例說明:

int型別的 3 的原碼是 11b(b表示二進位制位), 在32位機器上佔四個位元組,那麼高位補零就得:

00000000 00000000 00000000 00000011

int型別的 -3 的絕對值的二進位制位就是上面的 11b 展開後高位補零就得:

10000000 00000000 00000000 00000011      

但是原碼有幾個缺點,零分兩種 +0 和 -0 。很奇怪是吧!還有,在進行不同符號的加法運算或者同符號的減法運算的時候,不能直接判斷出結果的正負。你需要將兩個值的絕對值進行比較,然後進行加減操作 ,最後符號位由絕對值大的決定。於是反碼就產生了。

反碼是什麼 ?

正數的反碼就是原碼,負數的反碼等於原碼除符號位以外所有的位取反

舉例說明:

int型別的 3 的反碼是

00000000 00000000 00000000 00000011

和原碼一樣沒什麼可說的

int型別的 -3 的反碼是

11111111 11111111 11111111 11111100

除開符號位 所有位 取反

解決了加減運算的問題,但還是有正負零之分,然後就到補碼了

補碼是什麼?

正數的補碼與原碼相同,負數的補碼為 其原碼除符號位外所有位取反(得到反碼了),然後最低位加1.

還是舉例說明:

int型別的 3 的補碼是:

00000000 00000000 00000000 00000011

int型別的 -3 的補碼是

11111111 11111111 1111111 11111101

就是其反碼加1

最後總結一下:

正數的反碼和補碼都與原碼相同。

負數的反碼為對該數的原碼除符號位外各位取反。

負數的補碼為對該數的原碼除符號位外各位取反,然後在最後一位加1  

各自的優缺點:

原碼最好理解了,但是加減法不夠方便,還有兩個零。。

反碼稍微困難一些,解決了加減法的問題,但還是有有個零

補碼理解困難,其他就沒什麼缺點了

計算機中原碼 反碼 補碼

首先要明白,在計算機中,數以二進位制的形式存在,其中有無符號數和有符號數 無符號數的,相當於十進位制中的自然數,沒有負數,因此八位無符號數的範圍 00000000 11111111,而有符號數的最高位表示符號,最高位為0表示整數 0000 0001 1 最高位為1表示負數 1000 0001 1 原...

計算機中的原碼 反碼和補碼

計算機中的原碼 反碼和補碼 看到這個標題,很多人有話要說了,切!這個東西每一本計算機基礎知識的書中都有介紹的,你還拿出來show什麼嘛!我的原則是你需要就來看一看,懂就不要去理會,倒也不必諷刺兩句,我相信總有需要它的人。當初我看書是沒看明白的,在網上查了好多資料才有所悟。前幾天跟老婆講原碼 反碼和補...

計算機中的原碼 反碼 補碼分析

今天給學生上數字邏輯第一節課,主要講了數制,後面簡單提及了原碼 反碼和補碼,碰到了兩個問題 第一,十進位制數轉八進位制數,學生練習時卡殼,不知道無從下手 第二,原本以為原碼 反碼 補碼應該是一年級甚至中學時就應該解決的問題,實際上原來根本不是這麼回事。中學老師即使講過,估計也是對付考試的方式簡單提及...