【问题标题】:Java scanner nextInt(16) does not accept negative hex valuesJava 扫描程序 nextInt(16) 不接受负十六进制值
【发布时间】:2013-12-06 07:22:21
【问题描述】:

我需要以十六进制格式读取 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、-FFFFFFFF、-7FFFFFFFF、~FFFFFFFF),结果相同。

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

【问题讨论】:

  • 只是想知道,你试过-1 吗?
  • 试试-A...你会得到-10

标签: java int hex


【解决方案1】:

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

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

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

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

如果出现以下任何一种情况,就会抛出 NumberFormatException 类型的异常:

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

  • 基数要么小于 Character.MIN_RADIX 要么大于 Character.MAX_RADIX。

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

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

您必须将数字指定为负数。试试-1-80000000 或介于两者之间的任何东西;他们会工作的。

【讨论】:

    【解决方案2】:
     System.out.println("Enter first number in hexadecimal format: ");
     Scanner readX = new Scanner(System.in);
     String a = readX.nextLine().trim();
    

    int 结果 = Integer.parseInt(a, 16); 这对你有用。如果它不适合 int,你会得到科学记数法的价值。

    【讨论】:

      猜你喜欢
      • 2015-08-14
      • 2014-11-30
      • 1970-01-01
      • 2015-02-11
      • 2014-03-31
      • 1970-01-01
      • 2015-11-10
      • 2019-01-23
      • 2020-10-15
      相关资源
      最近更新 更多