負數補碼(two’s complement)的原理及證明

來源:互聯網
上載者:User

(轉自:http://blog.pcware.cn/linux/tows_complement_proof.html)

在本文裡面,com指代complement, neg指代negative,並且本文涉及的是”2的補碼”(two’s
complement)而不是”1的補碼”(one’s complement)

學過電腦的大部分人都知道負數在電腦內部是用補碼錶示的,但是大部分的教材和文章裡面都只是簡單的告訴你負數的補碼等於其反碼加一云云,至於為
什麼是這樣,則基本上都語焉不詳。

負數用補碼錶示的好處就是減法可以轉化為加法,簡化硬體設計,CPU只用一個加法器就可以進行加減法運算了。

下面我就嘗試著來證明一下,為什麼負數的補碼等於反碼加一。
理解下面的推導要求讀者必須瞭解模數的概念和求模運算。

假設我們的運算使用n位位元,那麼這n位位元的模數為2n
,數α為一個用n位二進位表示的常數,數x為一個用n位二進位表
示的變數,那麼α < 2n
,x < 2n
是成立的,在這裡α與x都是用原碼錶示的。現在
我們從α減掉x,推導如下:

α – x = 2n
%2n
+ (α – x) % 2n
        = (2n
+ (α – x)) % 2n
        = (α + 2n
– x) % 2n
        = (α) % 2n
+ (2n
– x) % 2n
        = α + (2n
– x)

我們現在將α – x這個減法運算成功演化成了 α + (2n

x)這個加法運算。從模數的概念我們知道,如果兩個數相加等於其模數,那麼這兩個數是互補的。在這裡x與2n

x是互補的,減掉數x與加上其補數2n

x是相等的。在這裡還隱藏了一層含義,一個正數加上一個負數,如果有進位產生,把進位簡單的捨棄掉是不影響計算結果的。
我們得出第一個結論:
xcom
= 2n
– x

反碼則簡單的多,一個數的全部二進位位取反則得到其反碼,由此可知,如果一個數加上它的反碼,則此全部二進位位是滿的,也就是全部是1,其值為2n-1
+ 2n-2
+ … + 22
+ 21
+ 20
=
2n
– 1
我們得出第二個結論
xneg
= 2n
– 1 – x

綜合結論一和二,我們可以做如下推導:
xcom
= 2n
– x
        = 2n
– 1 – x + 1
        = xneg
+ 1

至此我們得出最終結論一個n位位元的補數等於其反碼加一。

我們再回頭看看,我們曾經說“x與2n
– x是互補的,減掉數x與加上其補數2n

x是相等的”,減掉數x,我們可以看做是加-x,也就是”加-x”與”加2n
– x”是對等的,那麼在電腦中-x用2n
– x做其補碼就順理成章了,注意這裡說的是補碼而不是補數。

現在我們把x替換為1,n替換為8,得出-1的補碼為28
-1=255=0xFF,這就是-1在電腦裡面的真實面目。當然
對於正數就另當別論了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.