在Java中,為什么十六進制數0xFF取反之后對應的十進制數是-256呢?


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,然后除了符號位各位取反,最終得到的就是原碼。


免責聲明!

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



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