使用预定义的方法将负整数转换为十六进制值



我是Java的初学者,并且刚刚开始学习这种语言。

我正在学习和尝试Herbert Schildt的书中的例子,以测试我的理解。

我的目标是使用内置的Java方法将负整数转换为六角形,然后返回整数(或长)。但是,我面临两个问题:

问题#1:从线程六角字符串到十进制转换,Java Integer Parseint错误和将十六进制的字符串转换为十进制整数,转换后的值fffffff1太大,无法适合整数,所以我用了很长的时间。但是,当fffffff1转换回长时间时,我不会得到-15。我得到垃圾值= 4294967281

此外,当我从长时间到整数键入结果时,它效果很好。我不确定为什么很长的结果会显示垃圾价值,然后神奇地通过将数字输入到整数类型的情况下才能获得正确的值。我确定我在这里缺少一些重要的东西。

问题#2:如果我不使用radix(或者甚至在方法Long.parseLong()中将其从16更改为CC_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:

使用Two的补语表示负数,您可以在此处阅读更多有关:Wikipedia link

基本上,最左侧的位用于确定整数的符号(无论是正还是负)。a 0表示数字为正,而1表示为负。

fffffff1并不能一直向左走,因此,当您将其转换为长度为0时,最左侧的位为0,这意味着数字为正。当您将其投放到整数时,左侧位刚刚掉落,最终到达1秒的某个地方,以使您的最左边的数字现在为1,因此结果为负。

一个示例,长度短,为了演示:

4位编号:0111->这是积极的,因为它以0

开头

2位数字使用4位编号的最后2位:11->这是负数,因为它以1。

开头

longs在此示例中就像4位数字一样,INT就像2位数字一样。Longs有64位和INT有32位。


问题2:

如果您不指定radix,则long.parselong假定基础10.您将其提供" FFFFFFFF1",并且它不识别" F"为基础10中的数字,因此会引发异常。当您指定radix 16时,它知道" f" = 15,所以没有任何问题。

最新更新