1. 程式人生 > >關於補碼的一點思考

關於補碼的一點思考

機器數:一個數在機器中的二進位制表示模式(帶符號位)一般是補碼

真值:機器數表示的實際數(符號位01轉換為+-)

原碼:就是符號加絕對值表示法

反碼:正數的反碼是其本身,負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反

補碼:正數的補碼是其本身,負數的補碼是其反碼+1

 

一個計數系統可以存多少容量狀態的數,我叫它作為計數系統的Mod。一個計數系統不斷地加一,那麼它表示的數的狀態也會週期性地變化,我叫這個週期的大小叫做Mod。----------來自EmilKwan 的blog

補碼的好處:可以變減為加(這個思想類似於鐘錶轉一圈12h,逆時針轉x相當於順時針轉12-x),使得硬體設計中不再需要減法器。比如,a=3,b=4,a-b=a-b+mod=a+(mod-b),而這個mod-b其實就是將b按位取反再加1,注意不是b的補碼,因為正數的補碼是其本身,假定mod=2^4,則b就是0100,10000-0100=1+1111-0100,all_bits減去某個二進位制數相當於這個數的0變為1,1變為0.

任意一個數按位取反再+1兩次後為原來的數, 圖中任意一個數按位取反+1得到它的相反數,除非圖上沒有它的相反數,即0和-8,這兩個數按位取反+1為它本身。

注意看從-8到7,實際數從小到大,二進位制補碼同樣從小到大(0000>1111,因為1111+1=0000),這大概和符號位參與運算有關。假若不溢位的話,從圖上可以看出正+正,正+負(如3+(-2)=3+(16-2)%16=1),負+負都是正確的。

 

參考:https://www.cnblogs.com/guanjianzhuo/p/6017291.html