C語(yǔ)言 | 關(guān)于數(shù)據(jù)在計(jì)算機(jī)的存儲(chǔ)形式(二)
接上篇:C語(yǔ)言 | 關(guān)于數(shù)據(jù)在計(jì)算機(jī)的存儲(chǔ)形式
插播一條信息????
直播時(shí)間:每天下午15:00到17:00,晚上19:00到21:00開啟知識(shí)直播專場(chǎng)!?。?/p>
直播地址:B站主頁(yè)直播間,某音搜索“信盈達(dá)”賬號(hào)(有兩個(gè)號(hào),分享不一樣的知識(shí)直播);
還是趕緊行動(dòng)起來(lái)吧?。?!? ??

(第二個(gè)問題)
這就是我們遇到的第二個(gè)問題,為了計(jì)算結(jié)果和我們認(rèn)知一致,我們需要通過(guò)補(bǔ)碼的方式將數(shù)據(jù)進(jìn)行存儲(chǔ)。
這邊先給大家解釋一下什么是原碼、反碼和補(bǔ)碼,然后再和大家解釋為何我們需要補(bǔ)碼才能進(jìn)行正確的運(yùn)算。
對(duì)于一個(gè)正數(shù)而言它的原碼、反碼、補(bǔ)碼都是一樣的。
對(duì)于一個(gè)負(fù)數(shù),它的原碼是最高位置一,表示負(fù)數(shù),然后再按照數(shù)據(jù)的大小轉(zhuǎn)化為二進(jìn)制形式。

例如:-1 = 1000 0001
反碼是除了最高位之外,其他的所有位進(jìn)行取反操作,即:-1的反碼1111 1110。
補(bǔ)碼是將得到的反碼進(jìn)行+1操作,即:-1的反碼1111 1111。
我們?cè)倮脙蓚€(gè)數(shù)的補(bǔ)碼進(jìn)行運(yùn)算:1+(-1)
0000 0001 + 1111 1111 = 1 0000 0000

最高位的1溢出,即得到正確的0的結(jié)果。
由此可以看出,計(jì)算機(jī)只有通過(guò)反碼進(jìn)行存儲(chǔ)并運(yùn)算,才能得到正確的運(yùn)算結(jié)果。
?
(第三個(gè)問題)
那么現(xiàn)在來(lái)解釋第三個(gè)問題,我們?yōu)楹涡枰a(bǔ)碼才能計(jì)算出正確的結(jié)果?
首先我們要清楚,計(jì)算機(jī)和常規(guī)世界的的計(jì)算是有差異的。因?yàn)樵谟?jì)算機(jī)中存在溢出這一現(xiàn)象。例如對(duì)于一個(gè)八字長(zhǎng)的數(shù)據(jù),我們先不考慮它有符號(hào)的情況,最大的數(shù)就是:
1111 1111 = 255
255+1 = 256那是常規(guī)運(yùn)算的結(jié)果。但是如果計(jì)算機(jī)1 0000 0000最高位的1就溢出了,所以255+1=0。相信學(xué)習(xí)計(jì)算機(jī)的都會(huì)明白這個(gè)道理。
再用鐘表進(jìn)行舉例,相信大家會(huì)更加清楚。因?yàn)楸肀P也是一樣存在溢出的,例如11:59分再加一分鐘就是0:0啦。所以對(duì)于時(shí)鐘而言,我們從0點(diǎn)到達(dá)四點(diǎn)鐘,可以順時(shí)針走四個(gè)小時(shí),也可以逆時(shí)針走八個(gè)小時(shí),即對(duì)于表盤0+4=0+(-8)。

這就是計(jì)算機(jī)和數(shù)學(xué)的區(qū)別了。
再來(lái)回到我們的1+(-1),即:0000 0001+1111 1111,如果不考慮符號(hào)的話,就是1+255,即對(duì)于八個(gè)字長(zhǎng)的數(shù)據(jù)來(lái)說(shuō)1+(-1)和1+255是一樣的。
以上我們可以看到這樣就是利用了補(bǔ)數(shù)和溢出的原理,解決了計(jì)算機(jī)中的負(fù)數(shù)運(yùn)算的問題。
最后,回到我們開頭的問題就簡(jiǎn)單啦。
0:0000 0000
按位取反之后:
~0:1111 1111
在計(jì)算中1111 1111是補(bǔ)碼
反碼是是補(bǔ)碼減一,則反碼是1111 1110
再轉(zhuǎn)換成原碼:1000 0001即-1。
