问题描述
我尝试运行此代码,但发生错误。
System.out.println(Long.parseLong("9000000000000000",16));
我们知道long的最小数量是-9,223,372,036,854,775,808,而0x9000000000000000是-8,070,450,532,247,928,832为什么会发生错误?
解决方法
9000000000000000以16为基的正数,因为没有符号。由于long
已签名,因此它可以容纳的最大数字为0x7FFF_FFFF_FFFF_FFFF。所以你太厉害了。
如果您想要-8,070,450,532,247,928,832,832,请使用parseUnsignedLong()
:
System.out.println(Long.parseUnsignedLong("9000000000000000",16));
输出:
-8070450532247928832
现在接受的值为0xFFFF_FFFF_FFFF_FFFF。
,如果以下任何一个被抛出,则抛出NumberFormatException类型的异常。 发生以下情况:
- 第一个参数为null或长度为零的字符串。
- 基数小于Character.MIN_RADIX或大于Character.MAX_RADIX。
- 字符串的任何字符都不是指定基数的数字,但第一个字符可以是减号'-'('\ u002d')或加号'+'('\ u002B'),但前提是字符串长于长度1。
- 字符串表示的值不是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()
不会像算术一样“溢出”到负数-它不是解析位表示,而是解析整数。
以16为底的最大long
是7FFFFFFFFFFFFFFF
;你的价值比那更大。
用于十进制比较:
Base 16 Decimal
7FFFFFFFFFFFFFFF 9,223,372,036,854,775,807
9000000000000000 10,376,293,541,461,622,784