将toHexString创建的负数转换回Java中的int

watbbzwu  于 2023-11-15  发布在  Java
关注(0)|答案(3)|浏览(189)

我得到一个错误,因为下面的代码行:

int x = color(Integer.parseInt("ffffffde",16));

字符串
值“ffffffde”由以下代码创建:

Integer.toHexString(int_val);


错误代码:

Exception in thread "Animation Thread" java.lang.NumberFormatException: For input string: "ffffffde"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)


我认为这可能是因为它是一个负值。
你知道为什么或者怎么修吗?
编辑:
原来这是Java 8之前版本中的一个已知bug JDK-4215269
虽然可以将整数转换为十六进制字符串,但如果它们是负数,则无法将它们转换回来!

hivapdat

hivapdat1#

ffffffde大于整数最大值
Java int is 32 bit有符号类型的范围是从-2,147,483,648到2,147,483,647。

ffffffde = 4,294,967,262

字符串

编辑

您使用Integer.toHexString(int_val)将int转换为十六进制字符串。从该方法的文档中:
返回整数参数的字符串表示形式,表示为以16为底的无符号整数。
但是int是一个signed类型。

使用

int value = new BigInteger("ffffffde", 16).intValue();


将其作为负值返回。

zf2sa74q

zf2sa74q2#

如果你得到这样的错误,

Exception in thread "main" java.lang.NumberFormatException: For input string: "ffffffde"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Integer.parseInt(Integer.java:461)
    at com.TestStatic.main(TestStatic.java:22)

字符串
那么你传递的值ffffffde就有问题了。这不是一个有效的十六进制值,无法解析为int。
请试试这个

int x = Integer.parseInt("ffffde",16);
        System.out.println(x);


应该能用
对于超过16进制的值,您必须解析为Long

Long x = Long.parseLong("ffffffde",16);
        System.out.println(x);


这也应该可以

zi8p0yeb

zi8p0yeb3#

使用Java 8中引入的Integer.parseUnsignedInt方法而不是Integer.parseInt将产生所需的行为。

int x = color(Integer.parseUnsignedInt("ffffffde", 16));

字符串
问题是Integer.toHexString返回一个以16为基数的无符号整数,但Integer.parseInt将该值解析为有符号整数。由于作为有符号整数的ffffffde大于Integer.MAX_VALUE,因此引发了观察到的NumberFormatException
Integer.toHexString Javadocs指示parseUnsignedInt可用于将String转换回int
参数的值可以透过呼叫Integer.parseUnsignedInt(s, 16),从传回的字串s中复原。

相关问题