[英]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.