補碼符號位的權重

weixin_50810761發表於2020-12-10

補碼的由來

由於原碼在進行編碼時採用了數制與碼制相結合的方法,即最高位符號位採用0代表正數,1代表負數的碼制編碼方式,低位採用帶有相應權重的數制編碼方式進行編碼;而碼制是不能進行算術運算的,這就會出現5的原碼0_0101,加上-5的原碼1_0101,等於1_1010而不是等於0;而且會出現正零0_0與負零1_0的表達方式,但實際並不存在正零和負零,造成編碼的浪費;

補碼權重

由於原碼所存在的問題,就出現了補碼,補碼等於原碼按位取反加一,補碼採用數制編碼方式進行編碼,最高位(符號位)雖然依舊是0代表正數,1代表負數,但是卻有權重,權重位-2n;如下圖所示: 在這裡插入圖片描述
這也很好理解八位補碼中10000000(-128)為什麼是最小的,因為最高位的權重為負,而其它位的權重為正,其它為一,就會使求和的結果的數值增加;

補碼轉十進位制,十進位制轉補碼

由於補碼符號位具有權重,那麼補碼便可以直接轉化位十進位制數,例如:
10110110
=1*(-27)+0*(26)+1*(25)+1*(24)+0*(23)+1*(22)+1*(21)+0*(20)
=-128+32+16+4+2
=-74
1101.0110
=1*(-23)+1*(22)+0*(21)+1*(20)+0*(2-1)+1*(2-2)+1*(2-3)+0*(2-4)
=-8+4+1+0.25+0.125
=-2.625
相比於把補碼轉化成原碼在轉化成十進位制快很多;
十進位制轉補碼運算時採用反碼加一也是比較方便,只是注意在對帶有小數的原始碼取反之後,所加的這個一是加在最右邊那一位之上的;
比如:
-2.625
2.625=110.101
原碼:1110.101
反碼:1001.010
得補碼=1001.011
當然也可以不經過反碼;
-2.625=-4+1+0.25+0.125=1*(-22)+1*(20)+1*(2-2)+1*(2-3)
所以補碼=1001.011
比如:
-93=-128+32+2+1=1*(-27)+1*(25)+1*(21)+1*(20)
所以補碼為10100011

補碼位數的擴充套件就是符號位擴充套件

補碼進行位數的擴充套件,直接在高位擴充套件符號位即可,正數最高位擴充套件0大小不變,而負數的補碼n位補碼為1010……1101,則最高位的權重為-2n-1,當擴充套件成n+1位補碼11010……1101時,變化的就是最高位權重以及次高位的權重,最高位的權重為-2n,而次高位權重為2n-1,這兩位求和為1*(-2n)+1*(2n-1)=-2n-1;大小不變;所以補碼擴充套件位數直接對符號位進行擴充套件即可;
在對補碼進行十進位制轉化時可能得到簡化,比如:
1111011101=1011101=-26+24+23+22+20=-64+16+8+4+1=-35

相關文章