簡析二進位制補碼原理 補碼 反碼 1?

2021-10-08 12:31:02 字數 2291 閱讀 2187

在計算機系統中,規定數值一律用補碼來表示和儲存。因為使用補碼可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。

很多人很好奇為什麼要使用補碼表示和儲存?直接使用原碼表示多好,看上去更加直觀和易於計算。

那麼,為什麼計算機使用補碼比原碼更好,又是如何通過補碼來計算數值的呢?這其中的原理是什麼?

補碼的定義:正數的補碼與原碼相同。負數的補碼,將其原碼除符號位外的所有位取反(0變1,1變0,符號位為1不變)再+1,即為負數的反碼+1。

要了解補碼首先要了解「模」,模是補碼的基礎,「模」是指乙個迴圈週期的最大值,當超過這個最大值後就會開始新的週期,例如時鐘的乙個週期最大值是12,所以模就是12;一周的模是7天;一天的模是24小時。

補碼就是通過「模」將減法變加法,通過最形象的時鐘能最好理解:

假設當前時針指向8點,而準確時間是6點,調整時間可有以下兩種撥法:一種是倒撥(逆時針旋轉)2小時:8-2=6;另一種是順撥(順時針旋轉)10小時:(8+10)%12=6,這樣就有(8-2)%12=(8+10)%12=6

通過這個簡單栗子,可以看出在以12為模的系統(時鐘)裡,+10和-2效果是一樣的,因此凡是-2操作都可以用+10來代替,凡是+10操作都可以用-2來代替,所以對「模」而言,-2和+10互為補碼。

通過這個原理,我們還能得出還有-3和9、-4和8等等都互為補碼,觀察所有補碼規律,得出互為補碼的兩個值的絕對值之和等於模

為什麼會這樣呢?簡單理解就是因為補碼補碼,就是要補的,要把數補滿到模。

有人可能會說,符號都不同乙個正乙個負,怎麼能補滿到模呢?

其實這裡就陷入了乙個認知誤區了,因為符號是人為定義的,符號的不同只是表示方向不同而已,你能從時鐘裡找到數值的正負號嗎?如果我把順時針定義為-,逆時針定義為+,那麼+2和-10一樣互為補碼,這有什麼區別嗎?

所以乙個負數的補碼等於模減去負數的絕對值:x = -y mod n = ( n - y ),而正數的模運算等於本身所以補碼等於本身。

繼續通過這個時鐘的栗子,我們再來看一下如何使用補碼進行運算:

1、8 + 8 = ( 8+8 )%12 = 4:8點順撥8個小時到4點。

2、6 - 11 = ( 6+ (12-11) )%12 = 7:6點倒撥11個小時到7點。

如果從數值計算來看,第二個例子的結果應該是-5,沒錯,這也是有無符號數的區別。

我們繼續使用時鐘舉例,時鐘是典型的無符號數,如果我們現在需要給時鐘的數值加符號,來表示正負數,應該怎麼辦才好?

首先因為要分正負數,所以時鐘數值應該對半分,正數的範圍為[1, 6],負數的範圍為[-5,-1],其中0即模12既不是正數也不是負數。

通過上面補碼的原理,7和-5、8和-4、9和-3、10和-2、11和-1互為補碼,所以我們就可以用7、8、9、10、11來表示-5、-4、-3、-2、-1,可以畫個時鐘來看一下。

本質上,時鐘的數值並沒有變,只是數值表示的含義變了。7在無符號數中表示7,在有符號數中表示-5,但在運算中都是用7來計算。這也是為什麼使用補碼符號位可以參與運算,因為符號位本身就是人為定義的,而數值本身並沒有改變,在運算中從來沒有考慮過符號位,僅用單純的加法運算進行運算。

使用補碼計算得到的也是補碼,所以第二個例子的結果是7(-5的補碼)是正確的。

為什麼負數原碼除符號位外逐位求反再+1,就可以得到其補碼?

我們首先來看反碼,1 + 0 = 1、10+01 = 11、101+010 = 111,通過最簡單的三個例子,我們可以知道任何一對反碼相加必然得到模下的最大值,但沒補滿到模,+1就剛好補到模。

為什麼符號位不取反?因為負數原碼就是在將正數原碼的符號位取反的結果,已經取反過一次了自然無需再取反了。

本文採用比較易懂的解釋來闡述補碼的原理,可能不嚴謹,多多見諒。

那看完本文的你們能解答下面的問題了嗎?

1、什麼是補碼?補了什麼?怎麼補的?

2、為什麼最高位為0的表示正數,最高位為1的表示負數?

3、為什麼符號位能夠參與運算?

4、為什麼正數的原反補碼都是它本身,而負數的補碼等於原碼的反碼+1?

注:本人水平有限,如果文中解釋有誤,希望能指出,或者有什麼建議可以一起**,共同進步。

參考文章

二進位制補碼計算原理詳解

原碼, 反碼, 補碼 詳解

二進位制的補碼 反碼

本部落格介紹如何求二進位制數的原碼 補碼 反碼。對於正數來說,原碼,反碼,補碼都是一樣的。對於負數,即二進位制最高為1 求補碼 從數的右邊往左開始數,遇到 0 不理它,直到遇到第乙個 1 為止 不包括這個1 以後的每一位數取反即是它的原碼或補碼,符號位不變,還是 1 補碼的補碼是原碼 如原碼 110...

二進位制原碼 反碼 補碼詳解

原碼 原碼是指將最高位作為符號位 0表示正,1表示負 其它數字位代表數值本身的絕對值的數字表示方式。例如 數字6 在計算機中原碼表示為 0 000 0110 其中,第乙個數字0是符號位,0表示正數,0 000110是數字6的二進位制資料表示。數字 6 在計算機中原碼表示為 1 000 0110 以上...

二進位制 真值 原碼 反碼 補碼

機器數 乙個數在計算機中二進位制的表示形式叫機器數,機器數是帶符號的 計算機使用最高位來表示符號位 負數為1 正數為0.假如計算機的字長為8位 那麼對於十進位制3的機器數表示為0000 0011 而對於 3的機器數表示為1000 0011。真值 由於機器數是帶符號的所以機器數的形式值就不等於實際的值...