原碼反碼補碼具體的講解可以看看這篇:https://blog.csdn.net/afsvsv/article/details/94553228
總結一下計算方法
對於a-b,
首先,將a、b轉換成二進制數,這時候的二進制數是無符號的。計算a無 - b無
原碼:將無符號數首位當成符號位,正數置為0,負數置為1。這里要注意b的大小不應該超過原碼可以表示的范圍,否則轉換出來的原碼是錯誤的。計算a原+b原
反碼:在原碼的基礎上,將函數的非符號位取反,符號位不變。計算a反+b反
補碼:在反碼的基礎上,負數加1,正數不變;
或者在原碼的基礎上,對符號位后面(n-1)位的數字取模(假如后面(n-1)位表示數值,那么模為2^(n-1),用二進制表示就是首位1跟着n-1個0)
這里的模就是mod后面的那個數,C的計算符是%
比如,a=3,b=5,計算a-b
轉換成二進制無符號數a無=0101,b無=0111,這時仍要計算0101 - 0111(不要計算結果,是錯誤的)
轉換成原碼a反=0101,b反=(-0111)=1111,這時要計算0101+1111(不要計算結果,是錯誤的)
轉換成補碼a補=0101,b補=1001,這時計算0101+1001=1110(這是a-b的補碼表示,轉換成原碼是1010,即-2,正確)