今天發(fā)現(xiàn)了個(gè)問(wèn)題,就是對(duì)原碼,反碼,補(bǔ)碼又模糊了。這個(gè)問(wèn)題上學(xué)時(shí)候?qū)W過(guò),因?yàn)橛玫揭膊檫^(guò)幾次,每次都是這樣,每次都會(huì)在一段時(shí)間后慢慢忘記,也許是當(dāng)初學(xué)的不夠好,也許是因?yàn)楝F(xiàn)在的計(jì)算機(jī)中雖然時(shí)刻在運(yùn)行著這些,但是在日常的使用中確看不到這些東西。再次把它們找出來(lái)吧。轉(zhuǎn)載一篇csdn的文章
數(shù)值有正負(fù)之分,計(jì)算機(jī)就用一個(gè)數(shù)的最高位存放符號(hào)(0為正,1為負(fù)).這就是機(jī)器數(shù)的原碼了.假設(shè)機(jī)器能處理的位數(shù)為8.即字長(zhǎng)為1byte,原碼能表示數(shù)值的范圍為
(-127~-0 +0~127)
共
256
個(gè)
.
?
有了數(shù)值的表示方法就可以對(duì)數(shù)進(jìn)行算術(shù)運(yùn)算
.
但是很快就發(fā)現(xiàn)用帶符號(hào)位的原碼進(jìn)行乘除運(yùn)算時(shí)結(jié)果正確
,
而在加減運(yùn)算的時(shí)候就出現(xiàn)了問(wèn)題
,
如下
:
假設(shè)字長(zhǎng)為
8bits
( 1 )?10-? ( 1 )10?=? ( 1 )10?+ ( -1 )10?= ?( 0 )10
(00000001)原?+ (10000001)原?= (10000010)原?= ( -2 )?
顯然不正確
.
?
因?yàn)樵趦蓚€(gè)整數(shù)的加法運(yùn)算中是沒(méi)有問(wèn)題的
,
于是就發(fā)現(xiàn)問(wèn)題出現(xiàn)在帶符號(hào)位的負(fù)數(shù)身上
,
對(duì)除符號(hào)位外的其余各位逐位取反就產(chǎn)生了反碼
.
反碼的取值空間和原碼相同且一一對(duì)應(yīng)
.
下面是反碼的減法運(yùn)算
:
?( 1 )10?-? ( 1 )?10=? ( 1 )?10+ ( -1 )?10= ?( 0 )10
?(00000001)?反+ (11111110)反?=? (11111111)反?=? ( -0 )?
有問(wèn)題
.
( 1 )10?-? ( 2)10?=? ( 1 )10?+ ( -2 )10?= ?( -1 )10
(00000001)?反+ (11111101)反?=? (11111110)反?=? ( -1 )?
正確
問(wèn)題出現(xiàn)在
(+0)
和
(-0)
上
,
在人們的計(jì)算概念中零是沒(méi)有正負(fù)之分的
.(
印度人首先將零作為標(biāo)記并放入運(yùn)算之中
,
包含有零號(hào)的印度數(shù)學(xué)和十進(jìn)制計(jì)數(shù)對(duì)人類(lèi)文明的貢獻(xiàn)極大
).
于是就引入了補(bǔ)碼概念
.
負(fù)數(shù)的補(bǔ)碼就是對(duì)反碼加一
,
而正數(shù)不變
,
正數(shù)的原碼反碼補(bǔ)碼是一樣的
.
在補(bǔ)碼中用
(-128)
代替了
(-0),
所以補(bǔ)碼的表示范圍為
:
(-128~0~127)
共
256
個(gè)
.
注意
:(-128)
沒(méi)有相對(duì)應(yīng)的原碼和反碼
, (-128) = (10000000)?
補(bǔ)碼的加減運(yùn)算如下
:
( 1 )?10-? ( 1 )?10=? ( 1 )10?+ ( -1 )10?= ?( 0 )10
(00000001)補(bǔ)?+ (11111111)補(bǔ)?=? (00000000)補(bǔ)?= ( 0 )?
正確
( 1 )?10-? ( 2)?10=? ( 1 )10?+ ( -2 )10?= ?( -1 )10
(00000001)?補(bǔ)+ (11111110)?補(bǔ)=? (11111111)補(bǔ)?= ( -1 )?
正確
??
所以補(bǔ)碼的設(shè)計(jì)目的是
:
????
⑴使符號(hào)位能與有效值部分一起參加運(yùn)算
,
從而簡(jiǎn)化運(yùn)算規(guī)則
.
⑵使減法運(yùn)算轉(zhuǎn)換為加法運(yùn)算
,
進(jìn)一步簡(jiǎn)化計(jì)算機(jī)中運(yùn)算器的線路設(shè)計(jì)
?
所有這些轉(zhuǎn)換都是在計(jì)算機(jī)的最底層進(jìn)行的,而在我們使用的匯編、
C
等其他高級(jí)語(yǔ)言中使用的都是原碼。看了上面這些大家應(yīng)該對(duì)原碼、反碼、補(bǔ)碼有了新的認(rèn)識(shí)了吧!