0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

補(bǔ)碼是誰(shuí)發(fā)明的_補(bǔ)碼有什么用

倩倩 ? 來(lái)源:網(wǎng)絡(luò)整理 ? 2018-02-28 16:03 ? 次閱讀

補(bǔ)碼就是正數(shù)的原碼的相反數(shù)的另一種編碼方式。它能把字長(zhǎng)內(nèi)的正數(shù),補(bǔ)足為全是0。

補(bǔ)碼的意義:

現(xiàn)實(shí)生活中,我們有加法、減法、乘法和除法,但在計(jì)算機(jī)中只有一個(gè)加法器。換句話說(shuō),加法運(yùn)算在計(jì)算機(jī)中可以直接完成,減法、乘法和除法運(yùn)算最終也得轉(zhuǎn)換為加法才能實(shí)現(xiàn),說(shuō)到這里,可以有些初學(xué)者會(huì)想,為什么計(jì)算機(jī)中不設(shè)計(jì)一個(gè)類似于“加法器”的“減法器”或者“乘法器”的部件,主要原因是在生活中看似一些很簡(jiǎn)單的東西要用電路來(lái)實(shí)現(xiàn)都很復(fù)雜、很困難的,再說(shuō)如果用一個(gè)加法器可以實(shí)現(xiàn)其它運(yùn)算,其它的“加法器”、“減法器”或者“乘法器”也就沒(méi)有必要了,這樣還能使電路的設(shè)計(jì)更簡(jiǎn)單。好了,現(xiàn)在我簡(jiǎn)要地說(shuō)一下補(bǔ)碼在計(jì)算機(jī)中的意義,計(jì)算機(jī)不能直接做減法,必須把相應(yīng)的減法變成加法,才能進(jìn)行計(jì)算。然而我們發(fā)現(xiàn),一個(gè)數(shù)減去另外一個(gè)數(shù),與一個(gè)數(shù)加上“另外一個(gè)數(shù)的補(bǔ)碼”結(jié)果是一樣的。這就是補(bǔ)碼對(duì)于計(jì)算機(jī)的意義:將減法運(yùn)算變成了加法運(yùn)算。

補(bǔ)碼是誰(shuí)發(fā)明的_補(bǔ)碼有什么用

補(bǔ)碼有什么用?

正數(shù)的補(bǔ)碼,就是基本身

負(fù)數(shù)的補(bǔ)碼,就是原碼按位取反加1

符號(hào)位,就是最高位,最左面的第一位;其它位,就是剩下的7位

由于運(yùn)算器進(jìn)行加法是最快的,因此,使用補(bǔ)碼是為了加快計(jì)算

碼”和“數(shù)”是兩個(gè)東西。

我們平時(shí)說(shuō)出或?qū)懗瞿场皵?shù)”,一般都是在十進(jìn)制下,用10個(gè)不同的“碼”(此處的“碼”還和原碼補(bǔ)碼反碼的概念不同)來(lái)表示。分別是0~9。超過(guò)9,也就是比最大的碼還大的數(shù),采用進(jìn)位的方式來(lái)表示。于是有了“位”的概念。即個(gè)位,十位,百位等等。

表達(dá)負(fù)數(shù)的時(shí)候由于為了與算術(shù)和代數(shù)符號(hào)當(dāng)中減號(hào)或作差相互兼容,就在該數(shù)前面加上減號(hào)。

這種對(duì)一個(gè)數(shù)的寫(xiě)法也可以被名門為一種編碼方式。在這種編碼方式下每個(gè)數(shù)都有一定的“位數(shù)”,即“長(zhǎng)度”。在計(jì)算機(jī)當(dāng)中規(guī)定一定的位數(shù)稱作“字長(zhǎng)”,比如4位,8位,16位,32位等等。只不過(guò),計(jì)算機(jī)的物理存儲(chǔ)數(shù)據(jù)是二進(jìn)制方式。我們?nèi)祟惸壳皞鹘y(tǒng)的還是比較喜歡用10進(jìn)制方式。并且,我們?nèi)祟愐话悴粫?huì)在書(shū)寫(xiě)數(shù)字的時(shí)候遇到“字長(zhǎng)”的概念。但是在念數(shù)字和記錄數(shù)據(jù)的時(shí)候,有一點(diǎn)點(diǎn)東西跟字長(zhǎng)相關(guān)。比如西方愛(ài)把數(shù)據(jù)分成三位一組三位一組的方式,覺(jué)得比較好記憶。比如12‘000讀成十二千,我們中國(guó)人愛(ài)以“萬(wàn)”為字長(zhǎng),1’2000,讀作一萬(wàn)二千。舉這個(gè)例子表示字長(zhǎng)的概念不是很恰當(dāng)。因?yàn)閷?duì)人而言這只是一種表達(dá)習(xí)慣。但是對(duì)機(jī)器而言,“字長(zhǎng)”則是計(jì)算的長(zhǎng)度單位。設(shè)計(jì)計(jì)算機(jī)進(jìn)行最簡(jiǎn)單的加法運(yùn)算,首先要考慮的就是加法器進(jìn)行一次加法運(yùn)算,位數(shù)是多長(zhǎng)?加法器設(shè)計(jì)成多少位的加法器?等等。這就是計(jì)算機(jī)的字長(zhǎng)。它和編碼方式一起,構(gòu)成了計(jì)算機(jī)進(jìn)行計(jì)算的基礎(chǔ)。

有了字長(zhǎng)的概念才好說(shuō)補(bǔ)碼。

在十進(jìn)制下也有補(bǔ)碼的概念。插一句,談到補(bǔ)碼一定要先明確字長(zhǎng)的長(zhǎng)度。

補(bǔ)碼是用來(lái)表示負(fù)數(shù)的一種編碼方式。也是為了在計(jì)算機(jī)的核心加法器部分的設(shè)計(jì)避免減法操作,存儲(chǔ)數(shù)據(jù)的時(shí)候避免存儲(chǔ)負(fù)號(hào)。

舉個(gè)例子,假如我們模擬一個(gè)字長(zhǎng)為4位的十進(jìn)制計(jì)算機(jī)。(假設(shè)有某種機(jī)制,可以在1位上有10種穩(wěn)定的狀態(tài))

對(duì)兩個(gè)數(shù)進(jìn)行求和運(yùn)算:1234 和 -1234

如果用原碼,那么我們需要用一個(gè)1位的寄存器來(lái)存儲(chǔ)和表示負(fù)號(hào)。假設(shè)就在4位的最左邊的最高位前用1表示負(fù)號(hào),0表示正號(hào)。

則,原碼表示上面兩個(gè)數(shù):

0 1234

1 1234

然后計(jì)算機(jī)做求和,做加法的過(guò)程中。計(jì)算機(jī)發(fā)現(xiàn),其中有一個(gè)數(shù)是負(fù)數(shù),于是要切換為兩個(gè)正數(shù)相減的模式來(lái)運(yùn)算。這很不方便。

于是,補(bǔ)碼被想出來(lái)了。

-1234和正1234相加不是等于0000嗎?在4位的字長(zhǎng)當(dāng)中的數(shù),和1234相加為0000的,是不是唯一的一個(gè)數(shù)哪?很明顯8766和1234相加等于1‘0000,后4位是0000。

那么,8766就可以看著是-1234的一種編碼表示方式,被稱作“補(bǔ)碼”。

所以,補(bǔ)碼就是把數(shù)1234在一個(gè)字長(zhǎng)內(nèi),補(bǔ)足為1’0000的數(shù)的編碼方式。也就是一個(gè)正數(shù)的相反數(shù),在計(jì)算機(jī)內(nèi)的表達(dá)方式。

加上符號(hào)位,正數(shù)0‘1234的相反數(shù)的補(bǔ)碼表示就是1’8766。

十進(jìn)制里,-1234的反碼就是1‘8765

所以,現(xiàn)在回到4位字長(zhǎng)的2進(jìn)制計(jì)算機(jī)里來(lái)看。補(bǔ)碼和反碼的構(gòu)成方式是一樣的。0’0001的相反數(shù)是-1。

補(bǔ)碼表示1‘1111

反碼表示1’1110

補(bǔ)碼是誰(shuí)發(fā)明的_補(bǔ)碼有什么用

補(bǔ)碼是誰(shuí)發(fā)明的

誰(shuí)發(fā)明的未知,但根據(jù)wikipedia上的說(shuō)法,最初是馮諾依曼引入到計(jì)算機(jī)的。

很早以前,許多計(jì)算機(jī)的內(nèi)部數(shù)值編碼是用的反碼,反碼這玩意有缺點(diǎn): 它的值域內(nèi)有-0和+0,一個(gè)數(shù)與它的補(bǔ)數(shù)相加為-0,這給運(yùn)算帶來(lái)一些麻煩。

補(bǔ)碼就沒(méi)有這些問(wèn)題,不但只有一個(gè)0,而且補(bǔ)碼的加減乘法都可以化簡(jiǎn)為加法一種方式。 所以在計(jì)算機(jī)里補(bǔ)碼對(duì)簡(jiǎn)化運(yùn)算器有很大的作用。

補(bǔ)碼的回顧以及補(bǔ)碼發(fā)明的思路推演思考

補(bǔ)碼與求補(bǔ)運(yùn)算的定義

N個(gè)二進(jìn)制位,M=N-1

通過(guò)一種編碼映射。100.。.00 - 111.。.11 表示 (-2^M) - (-1) ; 000.。.00 - 011.。.11 表示 (0) - (2^M - 1)

對(duì)于編碼A的求補(bǔ) f(A) = (2^N)- A

原碼轉(zhuǎn)化成補(bǔ)碼:

對(duì)于正數(shù)和零,原碼即是補(bǔ)碼

對(duì)于負(fù)數(shù)A,一般理解方法:

先做反碼,然后編碼意義上加1

求補(bǔ)運(yùn)算的意義:

換言之,若要對(duì)一個(gè)數(shù)A求反,對(duì)那個(gè)數(shù)的補(bǔ)碼A1做一次求補(bǔ)運(yùn)算f(A1),所求的補(bǔ)碼B1就是原來(lái)數(shù)A的相反數(shù)B的補(bǔ)碼。

這里提供原碼轉(zhuǎn)化成補(bǔ)碼另外一個(gè)理解方法

對(duì)于求負(fù)數(shù)A的補(bǔ)碼

本質(zhì)上,負(fù)數(shù)A的相反數(shù)B,B是正數(shù),B的原碼B1就是B的補(bǔ)碼,A的補(bǔ)碼就是f(B1)

---

機(jī)器實(shí)現(xiàn):

x-y = x-1-y+1 = (x-1) - y + 1

在補(bǔ)碼的轉(zhuǎn)碼中,這里的x=2^N

這里的(x-1) - y即使對(duì)y進(jìn)行反碼操作,在ALU中可以N位同時(shí)刷新

至于N位整數(shù)+1,有一定的進(jìn)位延時(shí)。

---

邊界情況:

容易看到,我們對(duì)-2^N求反,仍然是-2^N

對(duì)2^N-1求反,則是-(2^N)-1

---

利用補(bǔ)碼這種編碼性質(zhì)

f(y) = -y

x + y = x + y

x - y = x + f(y)

---

馬后炮:事后猜測(cè)補(bǔ)碼發(fā)明的思路, 從而看補(bǔ)碼的優(yōu)勢(shì)

先看正碼表示,設(shè)N=4, -1 = 1001; -2 = 1010, -1 》 -2, 但是 1001 《 1010,兩種映射的編碼的序性不一致

反碼呢,-1=1110, -2 = 1101, Ok,序性正確了,

然而,這里有一個(gè)問(wèn)題,就是正數(shù)與負(fù)數(shù)之間,有一個(gè)1的縫隙。-1=1110, 1=0001,從循環(huán)編碼的角度,這兩個(gè)編碼相差3:1110-》1111-》0000-》0001。

因?yàn)檎愫拓?fù)零是兩個(gè)數(shù),導(dǎo)致兩個(gè)數(shù)系的斷裂。怎么辦?讓負(fù)數(shù)整體往正數(shù)靠攏,邁進(jìn)一步(+1),負(fù)1沒(méi)有了。

這就是求補(bǔ)的過(guò)程了。反碼再加1。

我想,當(dāng)初寫(xiě)出計(jì)算機(jī)的編碼設(shè)計(jì)論文的大牛(好像是圖靈還是什么的),當(dāng)然有更深的考慮。但從序性和數(shù)系聯(lián)系的角度,補(bǔ)碼的發(fā)明是相當(dāng)合理的。而這種合理性,我個(gè)人認(rèn)為,正是其優(yōu)點(diǎn)。

從機(jī)器實(shí)現(xiàn)的角度,并不算復(fù)雜,但相對(duì)反碼的機(jī)器實(shí)現(xiàn),還是多了+1的進(jìn)位延時(shí)。

---

int與unsigned int的思考

順便,我也整理一下這里的誤區(qū)。

如果聲明變量a為int,但是卻當(dāng)作unsigned int,如果正常累加超出范圍,轉(zhuǎn)化成unsigned int結(jié)果應(yīng)該還是可信的。

不過(guò)算了,我們利用好轉(zhuǎn)換和保證類型的一致,這些底層的問(wèn)題我們確實(shí)還是當(dāng)作透明為好。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 補(bǔ)碼
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    7535
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言 關(guān)于原碼補(bǔ)碼問(wèn)題

    我想通過(guò)補(bǔ)碼得到原碼,但現(xiàn)在這個(gè)程序做不到,只能得到補(bǔ)碼,求大神指點(diǎn)。
    發(fā)表于 02-14 10:46

    補(bǔ)碼是什么 補(bǔ)碼和原碼的轉(zhuǎn)化

    計(jì)算機(jī)中的符號(hào)數(shù)三種表示方法,即原碼、反碼和補(bǔ)碼。三種表示方法均有符號(hào)位和數(shù)值位兩部分,符號(hào)位都是0表示“正”,1表示“負(fù)”,而數(shù)值
    發(fā)表于 12-11 17:45

    補(bǔ)碼加、減運(yùn)算規(guī)則

    補(bǔ)碼加、減運(yùn)算規(guī)則 在計(jì)算機(jī)中,通??偸?b class='flag-5'>用補(bǔ)碼完成算術(shù)的加減法運(yùn)算。其規(guī)則是:  [X+Y]補(bǔ)= [X]補(bǔ) + [Y]補(bǔ) ,[X-Y]
    發(fā)表于 10-13 22:46 ?1.1w次閱讀
    <b class='flag-5'>補(bǔ)碼</b>加、減運(yùn)算規(guī)則

    定點(diǎn)補(bǔ)碼一位除法的實(shí)現(xiàn)方案

    定點(diǎn)補(bǔ)碼一位除法的實(shí)現(xiàn)方案  與補(bǔ)碼乘法類似,也可以補(bǔ)碼直接完成除法運(yùn)算,即用 [X]補(bǔ)/[Y] 補(bǔ) 直接求得[X/Y]補(bǔ) 。補(bǔ)碼除法的規(guī)
    發(fā)表于 10-13 22:58 ?3276次閱讀
    定點(diǎn)<b class='flag-5'>補(bǔ)碼</b>一位除法的實(shí)現(xiàn)方案

    補(bǔ)碼乘法,補(bǔ)碼乘法計(jì)算詳細(xì)解說(shuō)

    補(bǔ)碼乘法,補(bǔ)碼乘法計(jì)算詳細(xì)解說(shuō)    1.補(bǔ)碼與真值得轉(zhuǎn)換公式    補(bǔ)碼乘法因符號(hào)位參與運(yùn)算,可以完成補(bǔ)碼數(shù)的“直接”乘法,而不需要求補(bǔ)級(jí)
    發(fā)表于 04-13 11:05 ?3.7w次閱讀

    補(bǔ)碼加法,補(bǔ)碼加法計(jì)算原理

    補(bǔ)碼加法,補(bǔ)碼加法計(jì)算原理    負(fù)數(shù)補(bǔ)碼表示后,可以和正數(shù)一樣來(lái)處理。這樣,運(yùn)算器里只需要一個(gè)加法器就可以了,不必為了負(fù)數(shù)的加法運(yùn)算,再配一個(gè)減
    發(fā)表于 04-13 11:41 ?1.8w次閱讀

    補(bǔ)碼減法,補(bǔ)碼減法原理是什么?

    補(bǔ)碼減法,補(bǔ)碼減法原理是什么?    負(fù)數(shù)的減法運(yùn)算也要設(shè)法化為加法來(lái)做,其所以使用這種方法而不使用直接減法,是因?yàn)樗梢院统R?guī)的加法運(yùn)算使用同一
    發(fā)表于 04-13 11:45 ?6738次閱讀

    補(bǔ)碼一位乘法原理詳解

    補(bǔ)碼一位乘法原理詳解
    發(fā)表于 04-13 14:12 ?1.6w次閱讀
    <b class='flag-5'>補(bǔ)碼</b>一位乘法原理詳解

    補(bǔ)碼解釋及運(yùn)算

    補(bǔ)碼解釋及運(yùn)算
    發(fā)表于 06-30 10:36 ?7148次閱讀

    C語(yǔ)言源碼補(bǔ)碼

    具體詳細(xì)介紹初入門C語(yǔ)言源碼補(bǔ)碼,通俗易懂,一目了然。
    發(fā)表于 11-19 15:23 ?2次下載

    計(jì)算機(jī)為什么使用補(bǔ)碼的形式來(lái)表示負(fù)數(shù)

    計(jì)算機(jī)三種編碼方式來(lái)表示同一個(gè)數(shù): 原碼:符號(hào)位加上真值的絕對(duì)值,第一位表示符號(hào),其余位表示值。 反碼:正數(shù)的反碼是其本身;負(fù)數(shù)的反碼是在其原碼的基礎(chǔ)上,符號(hào)位不變,其余位取反
    的頭像 發(fā)表于 02-12 15:28 ?8887次閱讀

    深入探求反碼和補(bǔ)碼

    本篇文章講解了計(jì)算機(jī)的原碼, 反碼和補(bǔ)碼。 并且進(jìn)行了深入探求了為何要使用反碼和補(bǔ)碼, 以及更進(jìn)一步的論證了為何可以反碼, 補(bǔ)碼的加法計(jì)算原碼的減法。 論證部分如有不對(duì)的地方請(qǐng)各位牛
    的頭像 發(fā)表于 09-15 15:23 ?1266次閱讀

    4位補(bǔ)碼范圍

    4位補(bǔ)碼可表示的整數(shù)的數(shù)值范圍是十進(jìn)制-8~7. 1000 → -8; 1001 → -7; 1010 → -6; 1011 → -5;
    發(fā)表于 06-06 09:37 ?0次下載

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

    在計(jì)算機(jī)內(nèi)部數(shù)值是以補(bǔ)碼的方式進(jìn)行存儲(chǔ)的,采用補(bǔ)碼進(jìn)行數(shù)據(jù)存儲(chǔ)當(dāng)然其優(yōu)點(diǎn),下面會(huì)一一介紹相關(guān)內(nèi)容,讓各位徹底弄懂原碼、反碼、補(bǔ)碼的概念以及為什么采用
    的頭像 發(fā)表于 01-09 12:25 ?3474次閱讀
    計(jì)算機(jī)原碼、反碼、<b class='flag-5'>補(bǔ)碼</b>的概念

    二進(jìn)制補(bǔ)碼及與原碼的互相轉(zhuǎn)換方法

    表示負(fù)數(shù)。其余位表示數(shù)值的大小。 二進(jìn)制補(bǔ)碼?是一種用于表示符號(hào)整數(shù)的二進(jìn)制編碼方式,常用于?計(jì)算機(jī)系統(tǒng)中。在補(bǔ)碼系統(tǒng)中,一個(gè)數(shù)字的補(bǔ)碼是通過(guò)對(duì)其原碼進(jìn)行位取反(即一補(bǔ)數(shù)或反碼),然
    的頭像 發(fā)表于 09-19 22:25 ?226次閱讀