簡體   English   中英

使用預定義方法將負整數轉換為十六進制值

[英]Converting negative integer to hex value using pre-defined methods

我是Java的初學者,剛剛開始學習這種語言。

我正在學習和嘗試赫伯特·希爾德(Herbert Schildt)的書中的示例,以檢驗我的理解。

我的目標是使用內置的Java方法將負整數轉換為十六進制,然后再轉換為整數(或長整數)。 但是,我面臨兩個問題:

問題1:據我了解,從線程十六進制字符串到十進制轉換Java Integer parseInt錯誤以及將十六進制字符串轉換為十進制整數 ,轉換后的值fffffff1太大而無法容納Integer,因此我使用了Long。 但是,當fffffff1轉換回Long時,我得不到-15。 我得到的垃圾值為4294967281

而且,當我將結果從Long強制轉換為Integer時,效果很好。 我不確定為什么Long結果會顯示垃圾值,然后神奇地通過將數字類型轉換為整數類型來獲得正確的值。 我確信我在這里錯過了一些關鍵的事情。

問題#2:如果在方法Long.parseLong()不使用基數(甚至不將其從16更改為4 ), Long.parseLong()出現異常。

這是我的代碼:

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:

負數使用二進制補碼表示,您可以在此處了解更多信息: Wikipedia鏈接

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

fffffff1不會一直向左移動,因此將其轉換為long時,最左邊的位是0,這表示數字為正。 當您將其強制轉換為整數時,剩下的位將被丟棄,最終以1的中間位置結束,因此您最左邊的數字現在為1,因此結果為負數。

一個示例,為了演示的緣故,其長度要短得多:

4位數字:0111->這是肯定的,因為它以0開頭

2位數字,使用4位數字的最后2位:11->這是負數,因為它以1開頭。

在本示例中,longs類似於4位數字,而ints類似於2位數字。 長整數有64位,整數有32位。


問題2:

如果您未指定基數,則Long.parseLong假定以10為底。您將其指定為“ fffffff1”,並且它無法將“ f”識別為以10為底的數字,從而引發異常。 當您指定基數16時,它將知道“ f” = 15,所以沒有任何問題。

暫無
暫無

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

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