計算機中的原始碼、反碼、補碼。
阿新 • • 發佈:2020-10-18
首先,我們先看一段程式碼:
public class TestDemo02 { public static void main(String[] args) { int num1 = 4; int num2 = -4; System.out.println(Integer.toBinaryString(num1)); System.out.println(Integer.toBinaryString(num2)); } }
這段程式碼是要列印num1和num2的二進位制表示,我們看下結果:
4很理解,100 = 1*2^2+0*2^1+0*2^0=4,但是-4 為什麼是11111111111111111111111111111100來表示??
這裡,我們就需要了解計算機中資料是如何儲存的。
一、基本定義
在計算機系統中,數值一律用補碼來表示和儲存。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以用補碼統一處理。此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬體電路。
- 原碼:二進位制表示。二進位制首位是符號位,0為正,1為負
- 反碼:正數,反碼和原碼一樣;負數,符號位不變,其他各位取反
- 補碼:正數,補碼和原碼一樣;負數,反碼末位加1,有進位則進位,但不改變符號
按照這個定義,我們看下-4是怎麼表示的。
-4的原碼,符號位為1表示負數
10000000 00000000 00000000 00000100
-4的反碼,符號位不變,其他各位取反
11111111 11111111 11111111 11111011
-4的補碼,反碼的末位加1,符號位不變
11111111 11111111 11111111 11111100
所以,我們看到跟java 執行輸出的結果是一致的。
二、負數的位運算
正數的原碼、反碼、補碼都一樣,直接運算即可,負數的位運算需要轉換成補碼運算後再轉成原碼。
例如:
-4<<2
① -4的原碼,符號位為1表示負數
10000000 00000000 00000000 00000100
② -4的反碼,符號位不變,其他各位取反
11111111 11111111 11111111 11111011
③ -4的補碼,反碼的末位加1,符號位不變
11111111 11111111 11111111 11111100
④對補碼進行左移兩位(最高位不變,次高兩位去掉,末尾兩位補0)
11111111 11111111 11111111 11110000
⑤取反碼,-1
11111111 11111111 11111111 11101111
⑥原碼,最高位不變,其他位去反
10000000 00000000 00000000 00010000
換算成十進位制就是-16.
我們用程式驗證下:
public class TestDemo02 { public static void main(String[] args) { int num2 = -4; System.out.println(num2<<2); } }
輸出結果:
因此,總結下,涉及到負數的位運算,計算過程:
擴充套件閱讀:為什麼需要反碼?