一、原碼
對於有符號數:原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其余位表示值。
例如:5

原碼的二進制:0000 0101
例如:-5
原碼的二進制:1000 0101
對於無符號數:原碼就是真值。
例如:5 源碼的二進制:0000 0101
在計算機中,可以區分正負的類型,稱為有符類型,無正負的類型(只有正值),稱為無符類型;所以無符號數無法表示負數
二、反碼
正數的反碼:是其本身
例如:5
原碼:0000 0101
反碼:0000 0101
負數的反碼:在其原碼的基礎上, 符號位不變,其余各個位取反.
例如:-5
原碼:1000 0101
反碼:1111 1010
三、補碼
正數的補碼:是其本身
例如:5
原碼:0000 0101
反碼:0000 0101
補碼:0000 0101
負數的補碼:在其原碼的基礎上, 符號位不變, 其余各位取反, 最后+1. (即在反碼的基礎上+1)
例如:-5
原碼:1000 0101
反碼:1111 1010
補碼:=反碼+1=1111 1010 +1 =1111 1011=251
例如:-1
原碼:1000 0001
反碼:1111 11110
補碼:1111 11111 =255
四、補碼轉源碼
正數:補碼與原碼相等 所以無需轉換
負數補碼轉源碼:在補碼的基礎上, 符號位不變, 其余各位取反, 最后+1. (即在反碼的基礎上+1)
補碼:1111 1101
反碼:1000 0010
原碼:1000 0011=-3
五、計算機采用補碼的意義
計算機通常用補碼來表示有符號數,計算機的一個數據可以看作是有符號數,也可以看作無符號數的,也就是說計算機並不知道你存的是有符號數還是無符號數,而且所做的運算並不需要管你存的是什么數
- 原因:簡化計算機基本運算電路,使加減法都只需要用加法電路實現,用加法替代減法。例如:2-1 =2+(-1);
- 目的:為了簡化計算機基本運算電路,使加減法都只需要通過加法電路實現,也就是讓減去一個正數或加上一個負數這樣的運算可以用加上一個正數來代替。於是改變負數存儲的形式,存儲成一種可以直接當成正數來相加的形式,這種形式就是補碼。
1、原碼計算加減法:加法正確 ,但是減法的結果錯誤

2、反碼計算加減法:加法與減法結果都是正確的

3、使用補碼計算加減法:加法與減法結果都是正確的,並且解決了-0 的問題

六、證明計算機中使用的是補碼
使用java語言證明:由於正數的原碼與補碼相同,所以這里我們使用負數證明 byte b=-3;


由結果可知JAVA代碼右位移1位的結果與我們使用補碼計算的結果一致
