我尝试运行这段代码,但出现了错误。
System.out.println(Long.parseLong("9000000000000000", 16));
我们知道最小的长整型数是-9,223,372,036,854,775,808,而0x9000000000000000的值为-8,070,450,532,247,928,832,为什么会出现错误呢?
我尝试运行这段代码,但出现了错误。
System.out.println(Long.parseLong("9000000000000000", 16));
我们知道最小的长整型数是-9,223,372,036,854,775,808,而0x9000000000000000的值为-8,070,450,532,247,928,832,为什么会出现错误呢?
9000000000000000的十六进制表示是一个正数,因为没有符号。由于long
是有符号的,它能够容纳的最大数字是0x7FFF_FFFF_FFFF_FFFF。因此,你的数字太大了。
如果你想使用-8,070,450,532,247,928,832,可以使用parseUnsignedLong()
函数:
System.out.println(Long.parseUnsignedLong("9000000000000000", 16));
输出:
-8070450532247928832
现在接受的值高达0xFFFF_FFFF_FFFF_FFFF。
关于Long#parseLong(String,int)的说明:
如果发生以下任何情况之一,将抛出NumberFormatException类型的异常:
- 第一个参数为null或长度为零的字符串。
- 基数小于Character.MIN_RADIX或大于Character.MAX_RADIX。
- 字符串中的任何字符不是指定基数的数字,但如果字符串长度大于1,则第一个字符可以是减号'-' ('\u002d')或加号'+' ('\u002B')。
- 字符串表示的值不是long类型的值。
示例:
parseLong("0", 10) 返回 0L
parseLong("473", 10) 返回 473L
parseLong("+42", 10) 返回 42L
parseLong("-0", 10) 返回 0L
parseLong("-FF", 16) 返回 -255L
parseLong("1100110", 2) 返回 102L
parseLong("99", 8) 抛出NumberFormatException
parseLong("Hazelnut", 10) 抛出NumberFormatException
parseLong("Hazelnut", 36) 返回 1356099454469L
使用基数16解析的十进制值为10376293541461622784,大于Long.MAX_VALUE(9223372036854775807),违反以下条件:
字符串表示的值不是long类型的值
因此抛出NumberFormatException
异常。
import java.math.BigInteger;
public class ParseLong {
public static void main(String[] args) {
System.out.println("Max Long value :" + Long.MAX_VALUE);
System.out.println("Min Long value :" + Long.MIN_VALUE);
System.out.println("Value without overflow " + new BigInteger("9000000000000000", 16));
System.out.println("Value by parseUnsigned " + Long.parseUnsignedLong("9000000000000000", 16));
System.out.println("Value by literal " + 0x9000000000000000L);
}
}
Long.parseLong()
不会像算术运算一样“溢出”为负数——它不是解析位表示,而是整数的数字。
十六进制中最大的long
是7FFFFFFFFFFFFFFF
;您的值比这还要大。
以十进制进行比较:
Base 16 Decimal
7FFFFFFFFFFFFFFF 9,223,372,036,854,775,807
9000000000000000 10,376,293,541,461,622,784