本文寫(xiě)作時(shí)長(zhǎng)3小時(shí)
計(jì)算機(jī)中,定點(diǎn)數(shù)的表示法有三種:原碼,反碼,補(bǔ)碼。99%的計(jì)算機(jī)使用補(bǔ)碼表示。
由于無(wú)符號(hào)定點(diǎn)數(shù)的原碼,反碼,補(bǔ)碼都是一樣的,所以也所謂什么原反補(bǔ)了。
原碼
有符號(hào)數(shù)的原碼表示
最高位為符號(hào)位,其余位數(shù)表示數(shù)值
符號(hào)位占據(jù)位7(第8位),剩余7位表示值
正數(shù)部分
最大為0111 1111
,十進(jìn)制為127
0000 0000
到0111 1111
,+0
到+127
,共128
個(gè)數(shù)
負(fù)數(shù)部分
最小為1111 1111
,十進(jìn)制為-127
1111 1111
到1000 0000
,-127
到-0
,共128
個(gè)數(shù)
0
的表示法
1000 0000
,十進(jìn)制為-0
0000 0000
,十進(jìn)制為+0
0的表示法用原碼有兩種形式,這是不行的
關(guān)于運(yùn)算
試試用原碼進(jìn)行1+(-1)
運(yùn)算
0000 0001
1000 0001
1000 0002
結(jié)果等于-2
,wrong
假定+0
和-0
是兩個(gè)數(shù)
8位有符號(hào)數(shù)的原碼可以表示256個(gè)數(shù)
然而+0
和-0
是沒(méi)有意義的,認(rèn)為是一個(gè)數(shù)的話,就是255
個(gè)數(shù)
無(wú)符號(hào)數(shù)的原碼表示
由于沒(méi)有符號(hào)位,所以8位都是數(shù)值位
最小0000 0000
,十進(jìn)制為0
最大1111 1111
,十進(jìn)制為255
范圍是0
~255
,共256
個(gè)數(shù)
反碼
反碼規(guī)定:正數(shù)部分的反碼與原碼相同,負(fù)數(shù)部分的反碼除去符號(hào)位各位取反
有符號(hào)數(shù)的反碼表示
負(fù)數(shù)部分
原碼表示
1111 1111
到1000 0000
所以反碼(去除符號(hào)位,各位取反)為
1000 0000
到1111 1111
正數(shù)部分
原碼表示
0000 0000
到0111 1111
反碼(和原碼相同)為
0000 0000
到0111 1111
范圍是1000 0000
~0111 1111
,-127
~127
也是256個(gè)數(shù)
關(guān)于0的表示
反碼的0也有兩種
1111 1111
和 0000 0000
看來(lái)反碼也不行啊 (○′?д?)? <table>
關(guān)于運(yùn)算
看看1+(-1)
的問(wèn)題解決了嗎
0000 0001
1111 1110
1111 1111
等于0,運(yùn)算問(wèn)題解決了,但是0的表示法的問(wèn)題依舊沒(méi)有解決
無(wú)符號(hào)數(shù)的反碼表示
與原碼相同
補(bǔ)碼
補(bǔ)碼規(guī)定:正數(shù)部分的補(bǔ)碼與原碼相同,負(fù)數(shù)部分的補(bǔ)碼為除去符號(hào)位反碼+1
有符號(hào)數(shù)的補(bǔ)碼表示
負(fù)數(shù)部分
原碼
1111 1111
到1000 0000
反碼(去除符號(hào)位,各位取反)
1000 0000
到1111 1111
補(bǔ)碼 (反碼+1)
1000 0001
到1000 0000
(溢出)
正數(shù)部分
原碼表示
0000 0000
到0111 1111
反碼(和原碼相同)為
0000 0000
到0111 1111
補(bǔ)碼(和原碼相同)
0000 0000
到0111 1111
關(guān)于0的表示
按照這個(gè)規(guī)則其實(shí)0的表示還是兩種
1000 0000
和 0000 0000
只不過(guò),1000 0000
規(guī)定為-128
所以0的表示就唯一了
負(fù)數(shù)部分:1000 0000
、1000 0001
到1111 1111
就是 -128
,-127
到-1
,所以就是-128
到-1
正數(shù)部分:0000 0000
到0111 1111
就是0
到127
整體就是-128-127
,嗯,可以
關(guān)于運(yùn)算
1+(-1)
0000 0001
1111 1111
0000 0000(溢出)
剛好是0000 0000
至此,運(yùn)算問(wèn)題解決,0的表示問(wèn)題解決。那就補(bǔ)碼了。
為什么要有原碼,反碼,補(bǔ)碼?
有很多原因,只單單從本文角度簡(jiǎn)單地來(lái)說(shuō)
原碼:解決數(shù)值的符號(hào)問(wèn)題
反碼:解決相同數(shù)值正負(fù)相加不等于0的問(wèn)題
補(bǔ)碼:解決0的表示不唯一的問(wèn)題
參考鏈接:
https://www.zhihu.com/question/20159860/answer/71256667
注意:
** 補(bǔ)碼的推導(dǎo)過(guò)程(本文,以及絕大多數(shù)教材)并不完全正確。如果單單從上述觀點(diǎn)去理解補(bǔ)碼,是理解不了補(bǔ)碼的,上述觀點(diǎn)只是從結(jié)果的某一方面來(lái)說(shuō),簡(jiǎn)單粗暴的進(jìn)行補(bǔ)碼推導(dǎo)。**
假如從原理來(lái)講,先看這個(gè),以后再做補(bǔ)充
https://www.zhihu.com/question/28685048/answer/41735701
理解有限,歡迎指正!