昨天看軟件設(shè)計(jì)師教程游桩,看到關(guān)于數(shù)字的機(jī)器編碼牲迫,有原碼、反碼和補(bǔ)碼借卧。
這些內(nèi)容我在大學(xué)的課程中學(xué)過盹憎,但是我有些無(wú)法理解原碼、反碼和補(bǔ)碼的意義是什么铐刘。
這次看到這個(gè)知識(shí)點(diǎn)陪每,我不想再這么不清不楚過去了,于是到網(wǎng)上搜索這三種碼的意義镰吵,特別是反碼和補(bǔ)碼這兩種的意義檩禾。
最終我找到了這兩種碼的意義,就是解決計(jì)算機(jī)做減法的問題疤祭。
為什么這么說呢盼产?
首先在計(jì)算機(jī)的世界只有兩種數(shù)字0和1,我們?cè)谟?jì)算機(jī)中看到的眾多數(shù)字都是通過0和1組合表示的勺馆,比如數(shù)字7就是0111戏售,這里我就不多解釋,因?yàn)檫@不是計(jì)算機(jī)專業(yè)課草穆。
在計(jì)算機(jī)中如果進(jìn)行減法灌灾,可以看作是一個(gè)正數(shù)加一個(gè)負(fù)數(shù),但是這樣進(jìn)行直接加會(huì)出現(xiàn)各種奇怪的答案悲柱,比如會(huì)出現(xiàn)諸如 1+(-1)= -2這種結(jié)果紧卒,這顯然是不對(duì)的。
于是誕生了反碼這種解決方案诗祸,但是這種方案有一個(gè)瑕疵在面對(duì)兩個(gè)負(fù)數(shù)相加會(huì)出現(xiàn)奇怪的答案跑芳,之所以瑕疵是因?yàn)橹嶙埽⒉皇遣荒芙鉀Q,是能夠解決博个,只是做的不那么漂亮怀樟,就是先將兩個(gè)負(fù)數(shù)當(dāng)作正數(shù)進(jìn)行相加,之后強(qiáng)制將結(jié)果變成負(fù)數(shù)盆佣,比如(-5)+(-5)變成5 + 5算出結(jié)果之后再在前面加一個(gè)負(fù)號(hào)往堡。
在這種背景下誕生了補(bǔ)碼這種解決方案,這種方案高明之處在于共耍,將兩個(gè)數(shù)相減轉(zhuǎn)換成相加虑灰,為了方便理解,我用鐘表舉一個(gè)例子痹兜,比如現(xiàn)在是10點(diǎn)穆咐,我想要將鐘表?yè)芘?點(diǎn)應(yīng)該怎么做?是不是有兩種方法字旭,一個(gè)是逆時(shí)針旋轉(zhuǎn)2個(gè)小時(shí)的時(shí)間对湃,一個(gè)是順時(shí)針旋轉(zhuǎn)10個(gè)小時(shí)。
發(fā)現(xiàn)沒有10 - 2 和 10 + 10 這兩種方案是等價(jià)的遗淳,即 10 - 2 = 10 + 10拍柒。
就這樣將 10 - 2 這么個(gè)減法的操作變成了10 + 10 的操作,將減法的操作變成了加法的操作屈暗,實(shí)際上計(jì)算機(jī)計(jì)算的時(shí)候也確實(shí)是這么計(jì)算的拆讯。
你是不是覺得很不可思議,10 + 10 怎么會(huì)等于8呢养叛?
你這么想10 + 10 = 20 因?yàn)殓姳硎?2進(jìn)制(也就是超過12便會(huì)重新計(jì)算)往果,于是20需要減去12,這樣一來不就是8了嗎一铅。
看到?jīng)]有計(jì)算機(jī)就是通過補(bǔ)碼這種方案陕贮,將減法變成了加法,于是我得出這樣一個(gè)感慨:只有加法潘飘。
多說兩句肮之,減法可以變成加法,乘法也可以變成加法卜录,除法最后也可以變成加法戈擒,自然只有加法,這一刻我也突然理解艰毒,為什么電子元件中有一個(gè)累加器的單元筐高,因?yàn)槎伎梢赞D(zhuǎn)換成加法。