2016-12-30 17 views
2

我是一名Java初學者,剛開始學習這種語言。使用預定義的方法將負整數轉換爲十六進制值

我在學習和試驗赫伯特·謝爾特的書中的例子來測試我的理解。

我的目標是使用內置java方法將負整數轉換爲十六進制,然後返回整數(或長整數)。然而,也有我面臨兩個問題:

問題#1:我從螺紋hex string to decimal conversionJava Integer parseInt errorConverting 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 
    } 
} 

有人可以幫我嗎?我不想爲上述問題打開重複線程,所以我將它們包括在內。

+1

FFFFFFF1不大於一個整數;如果你寫'System.out.println(0xFFFFFFF1)',你會得到你想要的-15。我不清楚你爲什麼牽扯多頭,因爲真的沒有理由牽涉他們。 – Makoto

+0

@Makoto - 感謝您的建議。我最初使用整數方法,但他們沒有工作。另外,我相信'FFFFFFF1'需要32位,但Int只提供31個有符號位。 1位留給符號。不是嗎?我可以將問題從Long更改爲Int。除非我缺少重要的東西,否則結果不會改變。 – watchtower

+0

您錯過了[這些積分值用二進制補碼]的部分(https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2)。你可以有32位(你會*無論如何*),而不需要訴諸'長'。由於你*期望*值是負值,所以簽名的這一事實實際上是你自己想要的。 – Makoto

回答

4

問題1:

負數用2的補碼來表示,您可以在此處詳細瞭解:wikipedia link

基本上,最左邊的位是用來確定整數的符號(無論是正面還是負面)。 0表示數字是正數,1表示負數。

fffffff1不會一直走到左邊,所以當您將它轉換爲long時,最左邊的位是0,這意味着數字是正數。當你將它轉換爲一個整數時,左邊的位將被刪除,並且最終會在1s中間的某個位置出現,這樣您的最左邊的數字現在爲1,因此結果爲負數。

一個例子,具有用於示範的緣故短得多的長度:

4位號:0111 - >這是正因爲它起始於0

使用的最後2個比特

2比特數4位數字:11 - >這是負數,因爲它以1開頭。

長整數類似於本示例中的4位數字,整數類似於2位數字。長整型有64位,整數有32位。


問題2:

如果沒有指定基數,龍。parseLong假定基數爲10.你給它「fffffff1」,並且它不會將「f」識別爲基數爲10的數字,從而引發異常。當你指定基數16時,它知道「f」= 15,所以沒有任何問題。

+0

感謝您的幫助。我認爲我不清楚的是,如果我們使用計算器將'fffffff1'轉換爲十進制數,我們會得到'4294967281'(請注意,這不是假定64位方案,而是使用4位的32位方案對於每個十六進制字符 - 我忽略了有符號位)。因此,'fffffff1'使用32位,所以我不確定是否填充1(當以2s補碼格式從Int到Long轉換時)是否會有所幫助。你看到我的觀點了嗎? – watchtower

相關問題