我们有字节string s = "1111000000000111000000000001000000000010010000000000000000000000"
(该值等于-1150951111012646912),如果我们使用Long.parseLong(s, 2)
,我们得到"
java.lang.NumberFormatException:对于输入字符串:"110000000100000001000000000011100000000000100000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
我修正了这个问题与这种方式转换
new BigInteger(s, 2).longValue();
请解释一下,我不明白发生了什么?
此值的情况相同:s = 1100000001000000010000000100000000001110000000010000010000000000
(等于-4593600976060873728)
new BigInteger(s, 2).longValue();
3条答案
按热度按时间6yt4nkrj1#
简单地说,
Integer.parseInt
和Long.parseLong
都不能解析二进制补码负数,除非用显式的'+'
或'-'
符号替换符号位。这可能与解析十进制数一致,如下所示:
要解析long的二进制补码值或任何其他值,可以使用Long.parseUnsignedLong。以下三个方法调用都能正确解析值,并输出
Long.MIN_VALUE
,第四个是问题中的特定值。印刷品
qoefvg9y2#
你传入的是一个大小为64的二进制字符串,它大于long类型的有符号字节的大小。由于
parseLong
不接受无符号二进制表示,而是希望在数字前面加上一个-或(可选的)+来表示符号,所以它会抛出一个错误。你可以传入parseLong类型的最大字节长度是63。与第一个示例等效的
parseLong
调用是Long.parseLong("-111111111000111111111110111111111101110000000000000000000000", 2)
,使用-符号和数字的二进制补码。gstyhher3#
您试图将64位无符号(长)整数分析为64位有符号(长)整数。
Java的
long
不是无符号的。您只能存储最多63位的正数。long
是9,223,372,036,854,775,807
或2^(63)
。最高有效位(最左边)是有符号位。
注:任何前导零都不会显示。
输出