日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

关于2的补码

發(fā)布時間:2025/3/21 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于2的补码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

問一個基本的問題。

負(fù)數(shù)在計(jì)算機(jī)中如何表示?

舉例來說,+8在計(jì)算機(jī)中表示為二進(jìn)制的1000,那么-8怎么表示呢?

很容易想到,可以將一個二進(jìn)制位(bit)專門規(guī)定為符號位,它等于0時就表示正數(shù),等于1時就表示負(fù)數(shù)。比如,在8位機(jī)中,規(guī)定每個字節(jié)的最高位為符號位。那么,+8就是00001000,而-8則是10001000。

但是,隨便找一本《計(jì)算機(jī)原理》,都會告訴你,實(shí)際上,計(jì)算機(jī)內(nèi)部采用2的補(bǔ)碼(Two's Complement)表示負(fù)數(shù)。

什么是2的補(bǔ)碼?

它是一種數(shù)值的轉(zhuǎn)換方法,要分二步完成:

第一步,每一個二進(jìn)制位都取相反值,0變成1,1變成0。比如,00001000的相反值就是11110111。

第二步,將上一步得到的值加1。11110111就變成11111000。

所以,00001000的2的補(bǔ)碼就是11111000。也就是說,-8在計(jì)算機(jī)(8位機(jī))中就是用11111000表示。

不知道你怎么看,反正我覺得很奇怪,為什么要采用這么麻煩的方式表示負(fù)數(shù),更直覺的方式難道不好嗎?

昨天,我在一本書里又看到了這個問題,然后就花了一點(diǎn)時間到網(wǎng)上找資料,現(xiàn)在總算徹底搞明白了。

2的補(bǔ)碼的好處

首先,要明確一點(diǎn)。計(jì)算機(jī)內(nèi)部用什么方式表示負(fù)數(shù),其實(shí)是無所謂的。只要能夠保持一一對應(yīng)的關(guān)系,就可以用任意方式表示負(fù)數(shù)。所以,既然可以任意選擇,那么理應(yīng)選擇一種最方便的方式。

2的補(bǔ)碼就是最方便的方式。它的便利體現(xiàn)在,所有的加法運(yùn)算可以使用同一種電路完成。

還是以-8作為例子。

假定有兩種表示方法。一種是直覺表示法,即10001000;另一種是2的補(bǔ)碼表示法,即11111000。請問哪一種表示法在加法運(yùn)算中更方便?

隨便寫一個計(jì)算式,16 + (-8) = ?

16的二進(jìn)制表示是 00010000,所以用直覺表示法,加法就要寫成:

 00010000
+10001000
---------
 10011000

可以看到,如果按照正常的加法規(guī)則,就會得到10011000的結(jié)果,轉(zhuǎn)成十進(jìn)制就是-24。顯然,這是錯誤的答案。也就是說,在這種情況下,正常的加法規(guī)則不適用于正數(shù)與負(fù)數(shù)的加法,因此必須制定兩套運(yùn)算規(guī)則,一套用于正數(shù)加正數(shù),還有一套用于正數(shù)加負(fù)數(shù)。從電路上說,就是必須為加法運(yùn)算做兩種電路。

現(xiàn)在,再來看2的補(bǔ)碼表示法。

 00010000
+11111000
---------
100001000

可以看到,按照正常的加法規(guī)則,得到的結(jié)果是100001000。注意,這是一個9位的二進(jìn)制數(shù)。我們已經(jīng)假定這是一臺8位機(jī),因此最高的第9位是一個溢出位,會被自動舍去。所以,結(jié)果就變成了00001000,轉(zhuǎn)成十進(jìn)制正好是8,也就是16 + (-8) 的正確答案。這說明了,2的補(bǔ)碼表示法可以將加法運(yùn)算規(guī)則,擴(kuò)展到整個整數(shù)集,從而用一套電路就可以實(shí)現(xiàn)全部整數(shù)的加法。

2的補(bǔ)碼的本質(zhì)

在回答2的補(bǔ)碼為什么能正確實(shí)現(xiàn)加法運(yùn)算之前,我們先看看它的本質(zhì),也就是那兩個步驟的轉(zhuǎn)換方法是怎么來的。

要將正數(shù)轉(zhuǎn)成對應(yīng)的負(fù)數(shù),其實(shí)只要用0減去這個數(shù)就可以了。比如,-8其實(shí)就是0-8。

已知8的二進(jìn)制是00001000,-8就可以用下面的式子求出:

 00000000
-00001000
---------

因?yàn)?0000000(被減數(shù))小于0000100(減數(shù)),所以不夠減。請回憶一下小學(xué)算術(shù),如果被減數(shù)的某一位小于減數(shù),我們怎么辦?很簡單,問上一位借1就可以了。

所以,0000000也問上一位借了1,也就是說,被減數(shù)其實(shí)是100000000,算式也就改寫成:

100000000
-00001000
---------
 11111000

進(jìn)一步觀察,可以發(fā)現(xiàn)100000000 = 11111111 + 1,所以上面的式子可以拆成兩個:

 11111111
-00001000
---------
 11110111
+00000001
---------
 11111000

2的補(bǔ)碼的兩個轉(zhuǎn)換步驟就是這么來的。

為什么正數(shù)加法適用于2的補(bǔ)碼?

實(shí)際上,我們要證明的是,X-Y或X+(-Y)可以用X加上Y的2的補(bǔ)碼完成。

Y的2的補(bǔ)碼等于(11111111-Y)+1。所以,X加上Y的2的補(bǔ)碼,就等于:

X + (11111111-Y) + 1

我們假定這個算式的結(jié)果等于Z,即 Z = X + (11111111-Y) + 1

接下來,分成兩種情況討論。

第一種情況,如果X小于Y,那么Z是一個負(fù)數(shù)。這時,我們就對Z采用2的補(bǔ)碼的逆運(yùn)算,求出它對應(yīng)的正數(shù)絕對值,再在前面加上負(fù)號就行了。所以,

Z = -[11111111-(Z-1)] = -[11111111-(X + (11111111-Y) + 1-1)] = X - Y

第二種情況,如果X大于Y,這意味著Z肯定大于11111111,但是我們規(guī)定了這是8位機(jī),最高的第9位是溢出位,必須被舍去,這相當(dāng)于減去100000000。所以,

Z = Z - 100000000 = X + (11111111-Y) + 1 - 100000000 = X - Y

這就證明了,在正常的加法規(guī)則下,可以利用2的補(bǔ)碼得到正數(shù)與負(fù)數(shù)相加的正確結(jié)果。換言之,計(jì)算機(jī)只要部署加法電路和補(bǔ)碼電路,就可以完成所有整數(shù)的加法。

總結(jié)

以上是生活随笔為你收集整理的关于2的补码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。