int number = 0xFF;
字面值是指在程序中無需變量保存,可直接表示為一個具體的數字或字符串的值。
0xFF是一個整數字面值,整數字面值的缺省類型是 int。
我們知道在Java中, int 是一個4個字節(32位)的基本數據類型。
那么0xFF實際上完整的寫法是0x000000FF。
4位二進制可以表示1位十六進制,那么 0x000000FF 轉換為二進制的寫法就是:
0000 0000 0000 0000 0000 0000 1111 1111
按位取反:
~number
= ~0xFF
= ~0x000000FF
= 0xFFFFFF00【H】 = 1111 1111 1111 1111 1111 1111 0000 0000【B】;
第一位是符號位,1表示負號,因此這里要進行一個轉換,從負數補碼的形式轉換成原碼,這樣才能求出它真實想表達的數值。
從補碼轉換成原碼,先減1得到反碼,然后取反得到原碼。
第一步,最低位減 1:
1111 1111 1111 1111 1111 1111 0000 0000【補碼】 - 1 = 1111 1111 1111 1111 1111 1110 1111 11111【反碼】
第二步,除符號位,各位取反:
1000 0000 0000 0000 0000 0001 0000 0000【原碼】
得到原碼后,計算它的數值部分得到:1 0000 0000【B】= 28 【Q】= 256【Q】
加上符號位,得出結果為:-256
因此,十六進制數0xFF取反之后對應的十進制數就是-256。
總結一下,這里涉及到的有三個知識點。
第一,在Java中,整數字面值的缺省類型是 int,它由 32bit 組成;
第二,按位取反~表示對一個二進制數按位取反,即將0變成1,將1變成0;
第二,在計算機系統中,有符號位的數值型數據是以補碼的形式來表示和存儲的。正數的補碼就是其本身;負數的補碼轉換為原碼,先對最低位減1,然后除了符號位各位取反,最終得到的就是原碼。