我是一名Java初學者,剛開始學習這種語言。使用預定義的方法將負整數轉換爲十六進制值
我在學習和試驗赫伯特·謝爾特的書中的例子來測試我的理解。
我的目標是使用內置java方法將負整數轉換爲十六進制,然後返回整數(或長整數)。然而,也有我面臨兩個問題:
問題#1:我從螺紋hex string to decimal conversion,Java Integer parseInt error和Converting Hexadecimal String to Decimal Integer的轉換值fffffff1
太大以適應整數明白,所以我用龍。但是,當fffffff1
轉換回Long時,我不會得到-15。我得到垃圾值= 4294967281
。
此外,當我將結果從Long輸入到Integer時,效果很好。我不確定爲什麼Long結果會顯示垃圾值,然後奇蹟般地通過將數字類型轉換爲整數類型來獲得正確的值。我相信我在這裏失去了一些至關重要的東西。
問題2:如果我沒有在方法Long.parseLong()
使用基數(甚至把它從16
更改爲4
),我得到一個異常。
這裏是我的代碼:
public class HexByte {
public static void main(String[] args) {
byte b = (byte) 0xf1;
System.out.println("Integer value is:"+Integer.valueOf(b)); //you would get -15
int i = -15;
System.out.println("Hexadecimal value is:"+Integer.toHexString(i));
//Let's try to convert to hex and then back to integer:
System.out.println("Integer of Hexadecimal of -15 is:"+(int)Long.parseLong(Integer.toHexString(i),16));
//type-cast to integer works well, but not sure why
System.out.println("Integer of Hexadecimal of -15 is:"+Long.parseLong(Integer.toHexString(i),16));
//This surprisingly throws garbage value
System.out.println("Integer of Hexadecimal of -15 is:"+Long.parseLong(Integer.toHexString(i)));
//doesn't work - throws an exception
}
}
有人可以幫我嗎?我不想爲上述問題打開重複線程,所以我將它們包括在內。
FFFFFFF1不大於一個整數;如果你寫'System.out.println(0xFFFFFFF1)',你會得到你想要的-15。我不清楚你爲什麼牽扯多頭,因爲真的沒有理由牽涉他們。 – Makoto
@Makoto - 感謝您的建議。我最初使用整數方法,但他們沒有工作。另外,我相信'FFFFFFF1'需要32位,但Int只提供31個有符號位。 1位留給符號。不是嗎?我可以將問題從Long更改爲Int。除非我缺少重要的東西,否則結果不會改變。 – watchtower
您錯過了[這些積分值用二進制補碼]的部分(https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2)。你可以有32位(你會*無論如何*),而不需要訴諸'長'。由於你*期望*值是負值,所以簽名的這一事實實際上是你自己想要的。 – Makoto