Java 为什么Byte.parseByte(“80”,16)会失败? System.out.println(Byte.toString((Byte)(1

Java 为什么Byte.parseByte(“80”,16)会失败? System.out.println(Byte.toString((Byte)(1,java,hex,byte,base,numberformatexception,Java,Hex,Byte,Base,Numberformatexception,第一个运算符是二进制移位。-128表示二进制代码中的0b10000000。1向左移位七次。 在第二条语句中,您使用的基数表示的是hex数字,如您在的示例中所看到的。如果您将语句更改为System.out.println(Byte.parseByte(“80”,10));,则不会出现异常。 希望这些解释能有所帮助。十六进制0x80是128进制。字节只能保存从-128到127的值,包括-128到127的值。因此,当您尝试解析128的值时,它失败了,因为该值不能表示为字节 如果要分析负值,则需要包

第一个运算符是二进制移位。
-128
表示二进制代码中的
0b10000000
1
向左移位七次。
在第二条语句中,您使用的基数表示的是
hex
数字,如您在的示例中所看到的。如果您将语句更改为
System.out.println(Byte.parseByte(“80”,10));
,则不会出现异常。

希望这些解释能有所帮助。

十六进制
0x80
是128进制。字节只能保存从-128到127的值,包括-128到127的值。因此,当您尝试解析128的值时,它失败了,因为该值不能表示为
字节

如果要分析负值,则需要包含负号:

System.out.println(Byte.toString( (byte)(1 << 7) ));//print "-128" 
System.out.println(Byte.parseByte("80", 16));//run time exception java.lang.NumberFormatException: Value out of range. Value:"80" Radix:16

例如,当执行从
int
byte
的转换时,如本例所示,有关值的总体大小的信息可能会丢失。将
int
值转换为
byte
只需丢弃除最低8位以外的所有位,因此将
int
128转换为
byte
将产生
-128

你读过javadoc吗?来自javadoc:我认为最后一个适用于你:如果出现以下任何一种情况,就会抛出NumberFormatException类型的异常:第一个参数为null或是长度为零的字符串。基数小于Character.MIN\u基数或大于Character.MAX\u基数。字符串中的任何字符不是指定基数的数字,但第一个字符可以是减号“-”(“\u002D”)或加号“+”(“\u002B”)假设字符串长度大于1。字符串表示的值不是byte类型的值。问你真正的问题。语句之间的区别很明显。我想你实际上想知道为什么第一个语句成功,而第二个语句失败,而人们可能期望它们产生相同的输出。@erickson你说了什么这正是我想知道的,我仍然不明白为什么第二条语句会失败。
System.out.println(Byte.parseByte("-80", 16)); /* Prints -128 */