為什么一個字節的補碼表示范圍是-128~127


轉載自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個)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM