Java无法将十六进制字符串解析为int

Java无法将十六进制字符串解析为int,java,integer,hex,numberformatexception,Java,Integer,Hex,Numberformatexception,有人能告诉我为什么这个代码会引发异常吗 int value = 0xabcdef01; System.out.println(value); // prints -1412567295 String hex = Integer.toHexString(value); System.out.println(hex); // prints abcdef01 // why does this line fail? Integer.pa

有人能告诉我为什么这个代码会引发异常吗

int value = 0xabcdef01;
System.out.println(value);                 // prints -1412567295
String hex = Integer.toHexString(value);
System.out.println(hex);                   // prints abcdef01
// why does this line fail?
Integer.parseInt(hex, 16);  
此代码引发以下异常:

java.lang.NumberFormatException: For input string: "abcdef01"
  at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
  at java.lang.Integer.parseInt(Integer.java:583)
我使用以下JDK在Windows7上运行

java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)

也许你想要的是

 int num = (int) Long.parseLong(hex, 16);  

问题是>=0x8000\u 0000的数字太大,无法存储在
int

中,也许您想要的是

 int num = (int) Long.parseLong(hex, 16);  

问题是>=0x8000\u 0000的数字太大,无法存储在
int

中,也许您想要的是

 int num = (int) Long.parseLong(hex, 16);  

问题是>=0x8000\u 0000的数字太大,无法存储在
int

中,也许您想要的是

 int num = (int) Long.parseLong(hex, 16);  

<>问题是,数字>=0x800 0y000太大,不能存储在<代码> int <代码> < /p> ,因为您使用java 8,请考虑方法:


当你使用java 8时,考虑方法:


当你使用java 8时,考虑方法:


当你使用java 8时,考虑方法:


您对无法返回自身的整数的混淆与toHexString()的特性有关,它返回“abcdef01”而不是“-543210ff”,后者真正代表原始整数。运行此命令以查看:

  int value = -0x543210ff;
  assert(value == 0xabcdef01);
  assert(value == Integer.parseInt("-543210ff", 16));

您对无法返回自身的整数的混淆与toHexString()的特性有关,它返回“abcdef01”而不是“-543210ff”,后者真正代表原始整数。运行此命令以查看:

  int value = -0x543210ff;
  assert(value == 0xabcdef01);
  assert(value == Integer.parseInt("-543210ff", 16));

您对无法返回自身的整数的混淆与toHexString()的特性有关,它返回“abcdef01”而不是“-543210ff”,后者真正代表原始整数。运行此命令以查看:

  int value = -0x543210ff;
  assert(value == 0xabcdef01);
  assert(value == Integer.parseInt("-543210ff", 16));

您对无法返回自身的整数的混淆与toHexString()的特性有关,它返回“abcdef01”而不是“-543210ff”,后者真正代表原始整数。运行此命令以查看:

  int value = -0x543210ff;
  assert(value == 0xabcdef01);
  assert(value == Integer.parseInt("-543210ff", 16));


@nafas的可能重复感谢这个链接似乎与np-mate有直接关系,顺便说一句,我只是试着用
Long.parseLong(十六进制)来确保这一点工作正常。@nafas的可能副本感谢该链接似乎与NP mate直接相关,顺便说一句,我只是尝试使用
Long.parseLong(十六进制)来确保这一点工作正常。@nafas的可能副本感谢该链接似乎与NP mate直接相关,顺便说一句,我只是尝试使用
Long.parseLong(十六进制)来确保这一点工作正常。@nafas的可能副本感谢该链接似乎与NP mate直接相关,顺便说一句,我只是尝试使用
Long.parseLong(十六进制)来确保这一点工作正常。我对低级数字存储缺乏了解,但Java int是32位,我的十六进制值不超过32位?长解析例程也会将其转换为正长值,而实际上它应该是负intvalue@cyber-monk实际上你的人数远远超过了,记住整数可以是负数吗?这意味着您实际上只得到31位来表示正数。这有效地将最大值减半。@Peter,我曾假设java会为我处理符号并将其转换为负的int值我对低级数字存储的理解不足,但java int是32位,我的十六进制值不超过这个值?长解析例程也会将其转换为正的长值,实际上,is应该是负整数value@cyber-monk实际上你的数字比这个大很多,还记得整数可以是负数吗?这意味着您实际上只得到31位来表示正数。这有效地将最大值减半。@Peter,我曾假设java会为我处理符号并将其转换为负的int值我对低级数字存储的理解不足,但java int是32位,我的十六进制值不超过这个值?长解析例程也会将其转换为正的长值,实际上,is应该是负整数value@cyber-monk实际上你的数字比这个大很多,还记得整数可以是负数吗?这意味着您实际上只得到31位来表示正数。这有效地将最大值减半。@Peter,我曾假设java会为我处理符号并将其转换为负的int值我对低级数字存储的理解不足,但java int是32位,我的十六进制值不超过这个值?长解析例程也会将其转换为正的长值,实际上,is应该是负整数value@cyber-monk实际上你的数字比这个大很多,还记得整数可以是负数吗?这意味着您实际上只得到31位来表示正数。这有效地将最大值减半。@Peter,我假设java会为我处理符号并将其转换为负的int值感谢这解决了我的问题,我假设了Integer。parseInt(…,16)将处理表示负的int值的十六进制感谢这解决了我的问题,我假设了Integer。parseInt(…,16)将处理表示负int值的十六进制感谢这解决了我的问题,我假设为整数。parseInt(…,16)将处理表示负int值的十六进制感谢这解决了我的问题,我假设为整数。parseInt(…,16)将处理表示负int值的十六进制不知道java对十六进制字符串使用了负号指示符,thankswas不知道java对十六进制字符串使用了负号指示符,thankswas不知道java对十六进制字符串使用了负号指示符,thankswas不知道java对十六进制字符串使用了负号指示符,谢谢