計算機原碼反碼補碼


計算機中保存的數據都是按照補碼來保存,涉及到的概念,原碼反碼補碼具體是什么,通過下面幾個例子來說明下。

正數

正數的原碼,反碼和補碼是一樣的。正數的原碼,其最高位代表符號位,1代表負數,0代表正數,具體看例子。

int 20的原碼?可以很快的得到如下結果,32個bit,高位補齊為0即可。

原碼:00000000 00000000 00000000 0001 0100

根據規則,其反碼和補碼如下。

反碼:00000000 00000000 00000000 0001 0100

補碼:00000000 00000000 00000000 0001 0100

負數

負數的原碼,最高位為1,反碼是固定最高位的情況下,其他低位1變0,0變1,補碼是反碼的基礎上加1,具體看例子。

int -20的原碼?可以很快的得到如下結果,32個bit,除了最高位為1,其他高位補齊為0即可。

原碼:10000000 00000000 00000000 0001 0100

反碼:11111111 11111111 11111111 11101011

補碼:11111111 11111111 11111111 11101100

0

考慮到高位為0時,其他位全部為0可以表示為+0,高位為1時,其他位全部為0有可以表示為-0,這樣就有兩個0,在計算機中-0代表當前數據類型的最小值。

 1 public class operatorDemo{
 2 
 3     public static void main(String[] args){
 4         //測試自增自減類型轉換
 5         byte b=127;
 6         //b+=1;//這樣寫沒問題
 7         //b=b+1;//這樣寫編譯不通過
 8         b++;//這樣寫沒問題
 9         System.out.println(b);
10     }
11     
12 }

輸出結果為-128,因為byte 127補碼為0111 1111,執行自增運算首先變成了int類型即00000000 00000000 00000000 0111 1111,然后加1變成00000000 00000000 00000000 1000 0000,最后向下轉型舍棄高位為byte變成1000 0000,這就是-0,發現通過這個補碼無法推測反碼再原碼,這樣就人為規定為-128了,計算機處理這個補碼時按照-128來處理。如果byte類型補碼是1111 1111時,應該是多少呢?這個高位為1一看就是負數,可以輕松推出反碼為1111 1110,再推出原碼為1000 0001,這個原碼則代表的就是-1,可以看出來補碼1111 1111~1000 0000代表范圍為-1~-128的負數。

 

參考博文:

(1)https://www.jianshu.com/p/47761557bab0

(2)https://www.cnblogs.com/youngchaolin/p/10463887.html

(3)https://www.cnblogs.com/nicerblog/p/11348608.html


免責聲明!

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



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