[英]Java printing Integer Vs Integer.toHexString() : Different outputs
在確定Java如何存儲和檢索整數時,我遺漏了一些東西。 我有以下代碼
public class Test1 {
public static void main(String args[]) {
int a = 100;
int negateA = (a | 0x80000000);
System.out.println("Negative A: " + negateA);
System.out.println("Negative A in HEX: " + Integer.toHexString(negateA));
}
}
輸出:
Negative A: -2147483548
Negative A in HEX: 80000064
從輸出中,HEX中的值對我有意義,因為我設置整數的最高有效位,其余值表示其十進制值為100,這是我最初設置的。
我不明白為什么當我打印整數時我得到-2147483548
java內部存儲數字與檢索數字之間有區別嗎?
這不是你如何從正數獲得負數! Java使用兩個補碼 。
為了反轉int
的符號(無論是初始正數還是負數),您可以:
~val + 1
對於long
s, byte
s和short
s也是如此。
它不起作用的唯一數字是0x80000000,即Integer.MIN_VALUE
,即-2 ^ 31。 但這是n位二進制補碼表示的特征之一:它可以表示從-2 ^(n-1)到2 ^(n-1)-1的數字。
我們以1為例:
0x00000001 // i = 1
0xFFFFFFFE // ~i
0xFFFFFFFF // ~i + 1 == -1
0xFFFFFFFF // i = -1
0x00000000 // ~i
0x00000001 // ~i + 1 == 1
區別在於“它是如何存儲”和“何時被檢索”,但它歸結為在轉換為十進制和二進制時如何解釋內部表示。 在第一種情況下,它被解釋為二進制補碼,產生負數。 使用Integer.toHexString將其轉換為十六進制時,它將被解釋為無符號值。 從Integer.toHexString的javadoc:
如果參數為負,則無符號整數值是參數加23 ^ 2; 否則,它等於參數
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.