在轉(zhuǎn)兩張講相關(guān)話題的兩張貼
在修改游戲過程中,大家可能會(huì)產(chǎn)生一點(diǎn)疑問,一字節(jié)數(shù)據(jù)可表示的范圍是0--255,那么負(fù)數(shù)又怎么表示呢?原來在計(jì)算機(jī)中是這樣規(guī)定的,用一個(gè)數(shù)的最高一位表示正負(fù),0為正,1為負(fù).如0111,1111轉(zhuǎn)換為十進(jìn)制為127,1111,1111為-127,由此我們知一字節(jié)的范圍為-127--127,其他字節(jié)的范圍類推.
上面講的都是原碼表示法,可在計(jì)算機(jī)中的數(shù)據(jù)都是以補(bǔ)碼存放的,只有這樣才能減輕cpu的負(fù)擔(dān).提到補(bǔ)碼,就不得不提反碼了.計(jì)算機(jī)中是這樣規(guī)定反碼的,如果是正數(shù),則按原碼形式不變,如127仍為0111,1111;而如果為負(fù)數(shù)則,第一位為1,其他各位取反(即0變?yōu)?,1變?yōu)?),如原碼-127(1111,1111),表示為1000,0000.
補(bǔ)碼同上,如果是正數(shù),則按原碼形式不變,如127仍為0111,1111;如果為負(fù)數(shù)則除第一位為1外,其他各位取反加1,如-127,先取反為1000,0000,然后加1,為1000,0001.但1000,0000比較特殊,用它來表示-128,由此我們知補(bǔ)碼可表示的范圍是-128--127。
上面這種方法是我們通用的。
下面這種方法,我們通常不用,講這種方法的書也不多,電子科大出版的《脈沖與數(shù)字電路-何緒凡 》里有講。
原碼、反碼、補(bǔ)碼的定義
1、原碼的定義
①小數(shù)原碼的定義
[X]原 =[X 0≤X <1
[1- X -1 < X ≤ 0
例如: X=+0.1011 , [X]原= 01011
X=-0.1011 [X]原= 11011
②整數(shù)原碼的定義
[X]原 =[X 0≤X <2n
[ 2n-X - 2n < X ≤ 0
2、補(bǔ)碼的定義
①小數(shù)補(bǔ)碼的定義
[X]補(bǔ) =[X 0≤X <1
[2+ X -1 ≤ X < 0
例如: X=+0.1011, [X]補(bǔ)= 01011
X=-0.1011, [X]補(bǔ)= 10101
②整數(shù)補(bǔ)碼的定義
[X]補(bǔ) =[X 0≤X <2n
[2n+1+X - 2n ≤ X < 0
3、反碼的定義
①小數(shù)反碼的定義
[X]反 =[ X 0≤X <1
[2-2n-1-X -1 <X ≤ 0
例如: X=+0.1011 [X]反= 01011
X=-0.1011 [X]反= 10100
②整數(shù)反碼的定義
[X]反 =[ X 0≤X <2n
[2n+1-1-X - 2n < X ≤ 0
4.移碼:移碼只用于表示浮點(diǎn)數(shù)的階碼,所以只用于整數(shù)。
①移碼的定義:設(shè)由1位符號(hào)位和n位數(shù)值位組成的階碼,則 [X]移=2n + X -2n≤X ≤ 2n
例如: X=+1011 [X]移=11011 符號(hào)位“1”表示正號(hào)
X=-1011 [X]移=00101 符號(hào)位“0”表示負(fù)號(hào)
②移碼與補(bǔ)碼的關(guān)系: [X]移與[X]補(bǔ)的關(guān)系是符號(hào)位互為反碼,
例如: X=+1011 [X]移=11011 [X]補(bǔ)=01011
X=-1011 [X]移=00101 [X]補(bǔ)=10101
③移碼運(yùn)算應(yīng)注意的問題:
◎?qū)σ拼a運(yùn)算的結(jié)果需要加以修正,修正量為2n ,即對結(jié)果的符號(hào)位取反后才是移碼形式的正確結(jié)果。
◎移碼表示中,0有唯一的編碼——1000…00,當(dāng)出現(xiàn)000…00時(shí)(表示-2n),屬于浮點(diǎn)數(shù)下溢。