話不多說,先給大家上一個代碼:
public class TestDemo {
public static void main(String[] args) {
int a = 10;
int b = 5;
System.out.println(a+~b);
}
}
運行結果是多少? 5? 15?
實踐是檢驗真理的唯一標準。上述代碼的真實輸出如下:
驚訝嗎?下來由筆者給大家解惑:
理解取反操作符(~)要先了解的理論:
1.在計算機中,所有數據的表示方式都是以補碼的方式存在;
2.正數:符號位爲0,原碼,反碼,補碼相同;
3.負數:符號位爲1,補碼 = 反碼 + 1。
正數取反解析:
step 1:先求得該數的原碼;
step 2:原碼取反得到答案原碼;
step 3:答案原碼轉爲補碼,最後化爲數值。
負數取反解析:
step 1:先求得該數的原碼;
step 2:再求得該數的補碼;
step 3:補碼取反得到答案補碼,最後化爲數值。
舉例說明:
(1)、~5 = -6過程解析
step 1:表示5的原碼
5的原碼爲:00000000 00000000 00000000 00000101。
step 2:對5的原碼取反
得到答案的原碼:11111111 11111111 11111111 11111010
step 3:將答案的原碼轉成補碼
通過原碼得到反碼:10000000 00000000 00000000 00000101
補碼 = 反碼 + 1:
答案的補碼爲:10000000 00000000 00000000 00000110
得到值:-6
前文中的答案4就是依此而來,10 + ~5 即爲 10 + (-6)= 4。
(2)、~(-3) = 2過程解析
step 1:表示-3
-3的原碼:10000000 00000000 00000000 00000011
-3的反碼:11111111 11111111 11111111 11111100
-3的補碼 = 反碼 + 1:11111111 11111111 11111111 11111101
step 2:對-3的補碼取反操作
得到答案的補碼:00000000 00000000 00000000 00000010
因爲首位,即符號位爲0,所以是正數,原碼 = 反碼 = 補碼
因此答案是2。
通過上述分析,小夥伴們的福利來了~
取反操作符(~)結論總結:
當n爲正數時,~(n) = -(n+1)
當n爲負數時,~(-n) = n - 1,忽略負號