您當前的位置:首頁 > 體育

補碼的計算方法

作者:由 Murphy 發表于 體育時間:2021-05-31

補碼反碼相等是什麼原因

1、二進位制補碼的計算方法

二進位制的補碼計算非常簡單,各種教材中也經常使用二進位制來說明原始碼、反碼與補碼三者的關係,掌握一定基礎的人都知道一下規則:

1.1 原碼

最高位為符號位,0表示正數,1表示負數。

例如:

X = 0b11 (3),四位元表示原碼 = 0011(3) ;

X = - 0b11(-3) ,四位元表示原碼 = 1011(11) ;

1.2 反碼

最高位為符號位,0表示正數,1表示負數。

正數的反碼等於本身,負數的反碼除符號位外,各位取反:

例如:

X = 0b11 (3),四位元表示原碼 = 0011(3),對應反碼為 = 0011(3) ;

X = - 0b11(-3) ,四位元表示原碼 = 1011(11),對應反碼為 = 1100(12) ;

1.3 補碼

最高位為符號位,0表示正數,1表示負數。

正數的補碼等於本身,負數的補碼等於反碼+1:

例如:

X = 0b11 (3),四位元表示原碼 = 0011(3),對應反碼為 = 0011(3) ,補碼為 = 0011(3);

X = - 0b11(-3) ,四位元表示原碼 = 1011(11),對應反碼為 = 1100(12),補碼為1101(13) ;

2、十進位制的補碼計算方法

對於十進位制數來說,透過前面的性質不難得到正十進位制數補碼等於其本身,對於負十進位制數來說如果還按位進行運算就太麻煩了!為了講明白,我們從補碼的起因說起:

“反碼加一”只是補碼所具有的一個性質,不能被定義成補碼。

負數的補碼,是能夠和其相反數相加透過溢位從而使計算機內計算結果變為0的二進位制碼

。這是補碼設計的初衷,具體目標就是讓1+(-1)=0,這利用原碼是無法得到的:

0001(1)+1001(-1)=1010(-2) \\

而在補碼中:

0001(1補)+1110(-1補)=1 0000(1溢位) \\

所以對於一個n位的負數-X,有如下關係:

X_補+(-X)_補=1 \underbrace{00···0}_n=2^n \\

所以假設暫存器是n位的,那麼-X的補碼,應該是

2^n-X

的二進位制編碼。

例如前面舉得例子:

例如:

X = - 0b11(-3) ,四位元表示原碼 = 1011(11),對應反碼為 = 1100(12),補碼為1101(13) ;

如果暫存器4位,-3對應的補碼二進位制數為13,剛好是

2^4-3

正十進位制數補碼等於其本身,n位暫存器下-X的補碼等於#FormatImgID_6#對應的二進位制編碼。

如果使用python的話,可以使用&來快速獲取補碼:

-3&0xf

Out[1]: 13

5&0xf

Out[2]: 5

這裡的0xf指的是0b1111,表示4位的暫存器。如果是7位暫存器,0b111111就是0x3f。

3、已知補碼怎麼求原碼?

對於正數來說,根據前面的介紹很容易知道 原碼=補碼=反碼,接下來主要討論給定負數的補碼怎麼求負數的原碼:

3.1 二進位制

先說結論:

補碼的補碼就是原碼

。下面開始證明:

已知二進位制的補碼為

X_補

,根據1。3中求補碼的過程易得

X=(X_補-1)_反 \\

事實上上式還等價於:

X=(X_補)_反+1 \\

可以簡單證明一下,根據反碼實際的求解過程可以得到下面式子:

a+a_反=0b \underbrace{11···1}_n=2^{n+1}-1=F \\

a_反+1=F-a+1 \\

當a=a-1時有:

(a-1)_反=F-(a-1) \\

上面兩式子說明了:

(a-1)_反=a_反+1 \\

用文字描述即:

取反加一等價於減一取反!

所以二進位制補碼有如下關係:

X=(X_補-1)_反=(X_補)_反+1=(X_補)_補 \\

也就是說補碼的補碼就是原碼,有點負負得正的意思哦。

3.1 十進位制

n位暫存器下-X的補碼等於#FormatImgID_15#對應的二進位制編碼。

(1)十進位制的情況下,如果給的補碼是無符號數

2^n-X

,那麼原碼即

(2^n-X)-2^n=-X

即可。

例如前面-3補碼無符號數是13,對應的原碼就是

13-2^4=-3

(2)十進位制的情況下,如果給的補碼是有符號數-Y,對應的無符號數就是

2^{n-1}+Y

,那麼原碼就是

(2^{n-1}+Y)-2^n=Y-2^{n-1}

例如前面-3補碼有符號數是-5,對應的原碼就是

5-2^3=-3

標簽: 補碼  原碼  反碼  二進位制  負數