計(jì)算機(jī)中的原碼、反碼、補(bǔ)碼

上學(xué)的時(shí)候就記住了下面這些:

原碼表示法是機(jī)器數(shù)的一種簡(jiǎn)單的表示法。其符號(hào)位用0表示正號(hào),用:表示負(fù)號(hào),數(shù)值一般用二進(jìn)制形式表示。
機(jī)器數(shù)的反碼可由原碼得到。如果機(jī)器數(shù)是正數(shù),則該機(jī)器數(shù)的反碼與原碼一樣;如果機(jī)器數(shù)是負(fù)數(shù),則該機(jī)器數(shù)的反碼是對(duì)它的原碼(符號(hào)位除外)各位取反而得到的。
機(jī)器數(shù)的補(bǔ)碼可由原碼得到。如果機(jī)器數(shù)是正數(shù),則該機(jī)器數(shù)的補(bǔ)碼與原碼一樣;如果機(jī)器數(shù)是負(fù)數(shù),則該機(jī)器數(shù)的補(bǔ)碼是對(duì)它的原碼(除符號(hào)位外)各位取反,并在未位加1而得到的。

當(dāng)時(shí)并沒有過度深究, 就只是記住而已。
最近研究8位機(jī)-128的補(bǔ)碼的時(shí)候深入學(xué)習(xí)了下,總結(jié)下。
首先說一下補(bǔ)的概念,個(gè)人理解:
對(duì)于一個(gè)時(shí)鐘,7點(diǎn),再過8個(gè)小時(shí):
7 + 8 = 15,也就是3點(diǎn) 即7 + 8 - 12 = 3;
從數(shù)學(xué)的角度來(lái)看,上式等于7 + (8 - 12) = 3
其含義就是先算出了8的補(bǔ),然后加上這個(gè)數(shù)
主要原因就是因?yàn)榍懊娴南嗉硬僮靼l(fā)生了溢出(15 > 12)

有這樣一種說法,根本就沒有符號(hào)位,最高位其實(shí)就是用來(lái)取模的 **
https://www.zhihu.com/question/20159860
感覺這個(gè)理解很到位
即加法操作產(chǎn)生溢出后需要減去模值
在補(bǔ)碼運(yùn)算中最高位用來(lái)
表示模**,可以判斷出原有的數(shù)是正數(shù)還是負(fù)數(shù),所以變成了符號(hào)位,是自然形成的符號(hào)位

00000001(補(bǔ)碼),0000001(原碼) - 00000000 (原碼)= 0000001 即為1

10000001(補(bǔ)碼),0000001(原碼) - 10000000 (原碼)= 10000001 即為1-128 = -127,-127的補(bǔ)碼就是10000001

那么,-128的補(bǔ)碼就是00000000(原碼)-10000000(原碼),最高位為0,其他位都為1

還有一種理解方式:
計(jì)算機(jī)中,8位,能表示256個(gè)數(shù)字是顯然的
0 - 255
但是人們不滿足于只能表示正數(shù)啊,所以要有負(fù)數(shù)存在
而且計(jì)算機(jī)是不能執(zhí)行減法操作的
因此就有了原碼的誕生,最高位用來(lái)做符號(hào)位
但是,其中有一個(gè)問題就是計(jì)算機(jī)在執(zhí)行加法操作的時(shí)候,如:

 1 + (-1) = 0;
00000001 + 10000001 = 10000010

結(jié)果卻是-2,這顯然不對(duì)啊
所以就有了反碼的誕生,專門用來(lái)處理負(fù)數(shù),上述加法變?yōu)?/p>

00000001 + 11111110 = 11111111

而此時(shí)-0的反碼即為1 1111111
此時(shí)的表示范圍為0 ~ 11111111
所以能表示-127 ~ 127
但是問題是此時(shí)還有一個(gè)+0的存在,其反碼就是他自己
這樣子就帶來(lái)一個(gè)問題就是有兩個(gè)0的存在,表示方式還不一樣。
這個(gè)時(shí)候,我們發(fā)現(xiàn)-0(11111111) 加上1就變成1 00000000,由于最高位溢出,故此時(shí)值為+0,那么就將這個(gè)值定義為0,兩個(gè)0的情況也沒有了
補(bǔ)碼就是這個(gè)概念,即反碼+1
即整個(gè)環(huán)往前走了一步,其他數(shù)往前走了一步都有替代者,但是11111111往前一走就溢出了,變成了00000000
所有的正負(fù)加減=0的操作本來(lái)都是-0,現(xiàn)在都是溢出然后取+0
這樣一來(lái)原本的所有值都在原本的反碼的基礎(chǔ)上+1,那么原本的

-1的原碼是10000001,反碼是11111110,現(xiàn)在補(bǔ)碼是11111111
-127的原碼是11111111,反碼是10000000,現(xiàn)在補(bǔ)碼是10000001

那,既然都往前走了一位,那現(xiàn)在補(bǔ)碼10000000表示誰(shuí)呢?
從-1到-127都有自己的反碼和補(bǔ)碼,也就是說,多出來(lái)一個(gè)數(shù)(兩個(gè)0變成一個(gè)0產(chǎn)生的歷史遺留問題),最高位還是1,所以就給了-128

參考:https://www.zhihu.com/question/20159860/answer/71256667

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 今天給學(xué)生上數(shù)字邏輯第一節(jié)課,主要講了數(shù)制,后面簡(jiǎn)單提及了原碼、反碼和補(bǔ)碼,碰到了兩個(gè)問題:第一,十進(jìn)制數(shù)轉(zhuǎn)八進(jìn)制...
    CodingTech閱讀 2,237評(píng)論 5 17
  • 一. 機(jī)器數(shù)和真值 在學(xué)習(xí)原碼, 反碼和補(bǔ)碼之前, 需要先了解機(jī)器數(shù)和真值的概念. 1、機(jī)器數(shù) 一個(gè)數(shù)在計(jì)算機(jī)中的...
    點(diǎn)贊狂魔刀鋒君已放棄治療閱讀 959評(píng)論 0 4
  • 本文轉(zhuǎn)載自原碼, 反碼, 補(bǔ)碼 詳解 本篇文章講解了計(jì)算機(jī)的原碼, 反碼和補(bǔ)碼. 并且進(jìn)行了深入探求了為何要使用反...
    騎摩托馬斯閱讀 1,421評(píng)論 0 2
  • 15年11月,我給四年后的自己寫了封信。時(shí)至今日,大部分目標(biāo)都已經(jīng)完成,少部分甚至超出了預(yù)估呢! ...
    娃娃4817閱讀 640評(píng)論 4 1
  • 從前總笑太輕狂,當(dāng)漫漫長(zhǎng)路只剩下一條拉得長(zhǎng)長(zhǎng)的寞寞影,只得笑嘆,何處暖陽(yáng)不傾城。是啊,何處,暖陽(yáng),不傾城?
    d9ae18df916e閱讀 150評(píng)論 0 0

友情鏈接更多精彩內(nèi)容