其實(shí)數(shù)據(jù)存儲(chǔ)在內(nèi)存中都是存儲(chǔ)的二進(jìn)制,二進(jìn)制又可分為原碼呜舒、反碼锭汛、補(bǔ)碼。最終存儲(chǔ)在內(nèi)存中的是“補(bǔ)碼”袭蝗。
- 一個(gè)正數(shù)的原碼唤殴、反碼、補(bǔ)碼都是它的二進(jìn)制表現(xiàn)形式到腥。(無符號(hào)數(shù)沒有原碼朵逝、反碼和補(bǔ)碼一說。只有帶符號(hào)數(shù)才存在不同的編碼方式乡范。)
例如:9 == int == 4個(gè)字節(jié) == 1個(gè)字節(jié)等于8位 == 整形有32位
正數(shù)的原碼:
0000 0000 0000 0000 0000 0000 0000 1001
正數(shù)的反碼就是正數(shù)的原碼:
0000 0000 0000 0000 0000 0000 0000 1001
正數(shù)的補(bǔ)碼也是整數(shù)的原碼:
0000 0000 0000 0000 0000 0000 0000 1001
二進(jìn)制的第一位是符號(hào)位配名,0代表整數(shù),1代表負(fù)數(shù)晋辆。
- 一個(gè)負(fù)數(shù)的原碼是首位為1的二進(jìn)制數(shù)渠脉。反碼是符號(hào)位不變,其他位取反栈拖。補(bǔ)碼是反碼加1连舍。
例如:-9
原碼為首位為1的二進(jìn)制數(shù):
1000 0000 0000 0000 0000 0000 0000 1001
反碼為符號(hào)位不變没陡,其他位取反:
1111 1111 1111 1111 1111 1111 1111 0110
補(bǔ)碼是反碼加1:
1111 1111 1111 1111 1111 1111 1111 0111
為什么會(huì)有原碼反碼補(bǔ)碼涩哟?
- 由于最高位是符號(hào)位,如果是0就代表正數(shù)盼玄,1就代表是負(fù)數(shù)贴彼。
- 那么直接存儲(chǔ)原碼,計(jì)算機(jī)在計(jì)算的時(shí)候還需要先判斷最高位才能計(jì)算埃儿,效率比較低
- 為了方便計(jì)算機(jī)計(jì)算器仗,所以有了反碼和補(bǔ)碼,然后計(jì)算機(jī)就不需要判斷符號(hào)位了,只做加法運(yùn)算就可以了精钮。
- 計(jì)算十進(jìn)制的表達(dá)式:1 - 1 = 0
1 - 1 == 1 + (-1)
0000 0001(原碼)
+1000 0001(原碼)
----------------
1000 0010(原碼) == -2
如果用原碼表示威鹿,讓符號(hào)位參與計(jì)算,顯然對(duì)于減法來說是不正確的轨香。這也是計(jì)算機(jī)內(nèi)部不以原碼表示的原因忽你。
- 為了解決原碼做減法的問題,出現(xiàn)了反碼:
1 - 1 == 1 + (-1)
0000 0001(反碼)
+1111 1110(反碼)
----------------
1111 1111(反碼) 轉(zhuǎn)成原碼 -> 1000 0000 == -0
發(fā)現(xiàn)用反碼計(jì)算減法臂容,結(jié)果的真值部分是正確的科雳,而唯一的問題其實(shí)就出現(xiàn)在“0”這個(gè)特殊的數(shù)值上,雖然人們理解上+0(0000 0000)和-0(1 0000 0000)是一樣的脓杉,但是0帶上符號(hào)是沒有任何意義的糟秘。而且0的編碼有兩個(gè)。
通常我們用最高的有效位來表示數(shù)的符號(hào)(當(dāng)用8位來表示一個(gè)整數(shù)時(shí)球散,第8位即為最高有效位尿赚,當(dāng)用16位來表示一個(gè)整數(shù)時(shí),第16位即為最高有效位蕉堰。)0表示正號(hào)吼畏、1表示負(fù)號(hào),這種正負(fù)號(hào)數(shù)字化的機(jī)內(nèi)表示形式就稱為“機(jī)器數(shù)”嘁灯,而相應(yīng)的機(jī)器外部用正負(fù)號(hào)表示的數(shù)稱為“真值”泻蚊。將一個(gè)真值表示成二進(jìn)制字串的機(jī)器數(shù)的過程就稱為編碼。
- 于是補(bǔ)碼出現(xiàn)了丑婿,解決了0的符號(hào)問題以及兩個(gè)編碼的問題性雄,0的編碼就只有+0,-0已經(jīng)等于-128了羹奉。
1 - 1 == 1 + (-1)
0000 0001(補(bǔ)碼)
+1111 1111(補(bǔ)碼)
----------------
10000 0000(補(bǔ)碼)
第一位溢出后轉(zhuǎn)成原碼 -> 0000 0000 == 0