轉載自https://blog.csdn.net/ai_yue/article/details/82777806
我們要先區分一下原碼、反碼和補碼的表示規則:
0的表示:
原碼:有正零和負零之分,[+0]補=0000 0000,[-0]補=1000 0000;
反碼:同樣有兩種表示方法,[+0]反=0000 0000 ,[-0]反=1111 1111;
補碼:零只有一種表示方法,不分正負,[0]補=0000 0000;
8為二進制表示的范圍為:
一個字節8位,如果采用原碼表示正整數(含0),可以表達0-255,即 2^8=256,一共256種狀態,從全0到全1的各種排列組合。如果要表示負數,則符號位需要占用一位(最高位,1代表負數,0代表正數),因此其絕對值最大范圍為0-127,即2^7=128,一共正負各128種狀態,如果不采用特殊處理,這時候0占用2個編碼(10000000和00000000),數據表示范圍為-127到-0及+0到127,這樣總體上一個字節只有255種狀態,因為其中0具有正0和負0之分,這不符合數學意義也浪費一個編碼。
除了以上的弊端,還有個原因是,早期硬件很昂貴,一位或者一個編碼的浪費都是不可饒恕的,因此人們想到了另一種編碼把負0利用起來,即當遇到負數時,采用補碼來表示就可以解決這個問題,而遇到正數或0時還是保留原碼表示。因此這個負0通過補碼算法處理后自然而然地被利用起來,用來表示-128.
補碼的算法為:絕對值的原碼各位取反后加1.
例1:負1的補碼: 絕對值的8位原碼為00000001 取反:11111110 加1 :11111111 此時最高位被處理為1,滿足高位為1代表負數的定義。
例2:負128的補碼: 絕對值的8位原碼為10000000 取反:01111111 加1 :10000000 此時同樣的最高位被置為1,同樣滿足高位為1代表負數的定義,同時原先表示負0的編碼被利用起來表示-128。 因此一個字節的有符號整數范圍為-128到127。
綜上為:
原碼+反碼:8位原碼和反碼能夠表示數的范圍是-127~127;
補碼:8位補碼能夠表示數的范圍是 -128~127。
(在補碼中用(-128)代替了(-0),所以補碼的表示范圍為:(-128~0~127)共256個)