Java扫描程序nextInt(16)不接受负十六进制值



我需要读取一个十六进制格式的32位数字。当我输入一个负值时,我会得到一个输入不匹配异常。只要数字是正数(00000000~7FFFFFFF),一切都会起作用,但任何负数(80000000~FFFFFFFF)都会失败。

     System.out.println("Enter first number in hexadecimal format: ");
     Scanner readX = new Scanner(System.in);
     int a = readX.nextInt(16);

我尝试过各种格式(FFFFFFFF,0xFFFFFFFF、-FFFFFFFFF和-7FFFFFFFF),结果都是一样的。

有什么想法吗?我觉得我一定错过了一些显而易见的东西,但我完全被难住了!

它将失败,原因与2147483648(比Integer.MAX_VALUE多一个)将为Integer.parseInt失败的原因相同:值太大。它不会将ffffffff80000000解释为负数,而是将其解释为大正数。这些数字太大了,不能解释为int

Scanner.nextInt(int radix)匹配一个正则表达式,看看它是否可以是int,然后将其传递给Integer.parseInt进行解析:

如果下一个令牌与上面定义的Integer正则表达式匹配,则该令牌将被转换为int值,方法是删除所有区域设置特定的前缀、组分隔符和区域设置特定后缀,然后通过Character.digit将非ASCII数字映射为ASCII数字,如果存在区域设置特定负前缀和后缀,则在前面加一个负号(-),并将结果字符串传递给具有指定基数的Integer.parseInt。

如果不能表示为int:,则Integer.parseInt将抛出NumberFormatException

如果发生以下任何情况,将引发NumberFormatException类型的异常:

  • 第一个参数为null或是长度为零的字符串。

  • 基数小于Character.MIN_radix或大于Character.MAX_radix。

  • 字符串中的任何字符都不是指定基数的数字,但第一个字符可以是减号"-"("\u002D")或加号"+"("\u002B"),前提是字符串长度大于1。

  • 字符串表示的值不是int类型的值。

您必须指定负数。尝试-1-80000000或介于两者之间的任何东西;它们会起作用的。

 System.out.println("Enter first number in hexadecimal format: ");
 Scanner readX = new Scanner(System.in);
 String a = readX.nextLine().trim();

int result=Integer.parseInt(a,16);这对你来说是有效的。然后,如果它不适合int,你就可以得到科学记数法的值。

最新更新