我是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,所以没有任何问题。