我需要读取一个十六进制格式的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
失败的原因相同:值太大。它不会将ffffffff
或80000000
解释为负数,而是将其解释为大正数。这些数字太大了,不能解释为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,你就可以得到科学记数法的值。