繁体   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