1. 程式人生 > 實用技巧 >原碼、反碼與補碼的基礎內容

原碼、反碼與補碼的基礎內容

原碼、反碼與補碼的基礎內容

原碼、反碼與補碼在計算機基礎中都是很重要的知識,可以將補碼用在數值計算中。

一般將數值的最高位設定為符號位:

  • 正數符號位為0
  • 負數符號位1

原碼

原碼是直接將數值轉換為二進位制的碼。

例如(以8位舉例):

1的原碼為 :0000 0001
-1的原碼為:1000 0001

反碼:

  • 正數的反碼就是原碼

  • 負數的反碼就是將原碼除了符號位之外,按位取反

例如:

1的反碼 :0000 0001
-1的反碼:1111 1110

補碼

  • 正數的補碼還是原碼
  • 負數的補碼是反碼+1

例如:

1的補碼為: 0000 0001
-1的補碼為:1111 1111

補碼與原碼的轉換

因為正數的原碼=反碼=補碼,所以,這裡僅僅是討論負數的原碼與補碼的相互轉換。

負數補碼轉換為原碼

  • 符號位不變,先將補碼-1,然後取反
  • 或者,先取反,然後+1

負數原碼求補碼:

  • 將符號位不變,按位取反,然後加1,獲得補碼

如果是先在取反之前,將數值+1,可能會出現也寫錯誤,因為如果該數值為-1,加1後就是0,符號為也發生變化,所以不推薦先加後變,應該是先變後加。

總結:

  1. 正數的原碼=反碼=補碼
  2. 負數的原碼變為反碼:符號位不變,剩餘位取反
  3. 負數的反碼變補碼:符號位不變,反碼+1
  4. 負數的原碼變為補碼:符號位不變,取反後加1
  5. 負數的補碼變為原碼:符號位不變,取反後加1或者先減一後再取反

數值溢位

因為有符號的數值的最高位為符號位,所以再數值達到最大值和最小值的時候,再增大或者減小,將會產生數值溢位。

資料溢位就是:當某一種型別的數值已經達到了此型別能夠儲存的最大值之後,再繼續擴大,或者達到了最小值後再繼續縮小,就會出現資料溢位問題。

Java中的整型的取值範圍為:-2147483648 ~ 2147483647

當java達到了最大值2147483647時,再增加1,輸出的結果為-2147483648

int i = Integer.MAX_VALUE;
System.out.println("int 的最大值為:" + i);
System.out.printf("最大值的16進製為:%x \n", i);
int j = i+1;
System.out.println("int 最大值加1為:" + j);
System.out.printf("16進製為:%x \n", j);

輸出的結果為:

int 的最大值為:2147483647
最大值的16進製為:7fffffff 
int 最大值加1為:-2147483648
16進製為:80000000 

當Java達到最小值時,再減1將會輸出2147483647

int min = Integer.MIN_VALUE;
System.out.println("int 的最小值為:" + min);
System.out.printf("最小值的16進製為:%x \n", min);
int k = min - 1;
System.out.println("int的最小值減一為:"+ k);
System.out.printf("16進製為:%x \n", k);

輸出的結果為:

int 的最小值為:-2147483648
最小值的16進製為:80000000 
int的最小值減一為:2147483647
16進製為:7fffffff 

因為一個數據型別的最大值和最小值是一個迴圈,也就是說在最大值的基礎上再擴大數值或者在最小值的基礎上再縮小數值,會跳到相反的最值上面