簡體   English   中英

"Java負整數到十六進制並返回失敗"

[英]Java negative int to hex and back fails

public class Main3 {
    public static void main(String[] args) {
        Integer min = Integer.MIN_VALUE;
        String minHex = Integer.toHexString(Integer.MIN_VALUE);

        System.out.println(min + " " + minHex);
        System.out.println(Integer.parseInt(minHex, 16));
    }
}

據記載, Integer.toHexString將整數的字符串表示形式返回為無符號值 - 而Integer.parseInt采用帶符號的int。 如果您使用Integer.toString(value, 16)那么您將得到您想要的。

這總是令我惱火的事情。 如果使用十六進制文字初始化int,則可以使用最大為0xFFFFFF的全范圍正值; 任何大於0x7FFFFF東西都是負值。 這對於位掩碼和其他操作非常方便,您只關心位的位置 ,而不是它們的含義。

但是,如果使用Integer.parseInt()將字符串轉換為整數,則將大於"0x7FFFFFFF"任何內容視為錯誤。 可能有一個很好的理由為什么他們這樣做,但它仍然令人沮喪。

最簡單的解決方法是使用Long.parseLong()代替,然后將結果轉換為int。

int n = (int)Long.parseLong(s, 16);

當然,只有在確定數字將在Integer.MIN_VALUE..Integer.MAX_VALUE范圍內時才應該這樣做。

根據文檔, toHexString返回“整數參數的字符串表示形式,作為基數為16的無符號整數。”

因此正確的反向操作可能是作為Java 8的一部分引入的Integer.parseUnsignedInt

public class Main3 {
    public static void main(String[] args) {
        Integer min = Integer.MIN_VALUE;
        String minHex = Integer.toHexString(Integer.MIN_VALUE);

        System.out.println(min + " " + minHex);
        System.out.println(Integer.parseUnsignedInt(minHex, 16));
    }

試試這個:

public class Main3 {
    public static void main(String[] args) {
        Integer min = Integer.MIN_VALUE;
        String minHex = Integer.toHexString(Integer.MIN_VALUE);

        System.out.println(min + " " + minHex);
        System.out.println(Integer.parseInt( "-" + minHex, 16));
    }

}

得到這個:

-2147483648 80000000
-2147483648

你需要包含一個負號。

我現在沒有權限對此進行測試,但如果您嘗試使用此值,我會打賭:

Integer min = Integer.MIN_VALUE + 1;

它不會炸彈,但是當你運行ParseInt(min,16)時會給你一個正數(不是負數ParseInt(min,16)

一串位實際上沒有足夠的信息來確定此上下文中的符號,因此您需要提供它。 (考慮使用min = "F" 。那是+/- F嗎?如果你將它轉換為位並看到1111, 並且你知道它是一個字節,你可能會認為它是負數,但這是很多IFS。

這似乎對我有用:

public class Main3 {
public static void main(String[] args) {
    Integer min = Integer.MIN_VALUE;
    String minHex = Integer.toHexString(Integer.MIN_VALUE);

    System.out.println(min + " " + minHex);
    System.out.println((int)Long.parseLong(minHex, 16));
}
}

整數被解析為處理這么大的正數的“有符號長整數”,然后通過將其轉換為“int”來找回符號。

Integer.parseInt()將有符號整數作為輸入。 這意味着輸入必須在“7FFFFFFF”和“-80000000”之間。 注意“80000000”之前的負號。 你想要的是Integer.parseInt("-80000000", 16) 如果使用不帶減號的 80000000,Java 會將其解釋為正數並拋出異常,因為 int 的最大正整數為 0x7FFFFFFF。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM