我需要以十六进制格式读取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),结果相同。
有什么想法吗?我觉得我必须遗漏一些显而易见的东西,但我完全被难过了!
答案 0 :(得分:2)
由于2147483648
的{{1}}(比Integer.MAX_VALUE
还要Integer.parseInt
}失败,它将失败:该值太大。它不会将ffffffff
或80000000
解释为负数,而是将其作为一个大的正数。这些数字太大而无法解释为int
。
Scanner.nextInt(int radix)
匹配正则表达式以查看它是否为int
,然后将其传递给Integer.parseInt
进行解析:
如果下一个标记与上面定义的整数正则表达式匹配,则将标记转换为int值,就像删除所有特定于语言环境的前缀,组分隔符和特定于语言环境的后缀一样,然后通过删除非ASCII数字到ASCII数字Character.digit,如果存在特定于区域设置的负前缀和后缀,则在前面加一个负号( - ),并将结果字符串传递给具有指定基数的Integer.parseInt。
Integer.parseInt
如果无法表示为NumberFormatException
,则会抛出int
:
如果发生以下任何一种情况,则抛出NumberFormatException类型的异常:
第一个参数为null或是一个长度为零的字符串。
基数小于Character.MIN_RADIX或大于Character.MAX_RADIX。
字符串的任何字符都不是指定基数的数字,除了第一个字符可能是减号' - '('\ u002D')或加号'+'('\ u002B' )如果字符串长度超过长度1.
字符串表示的值不是int类型的值。
您必须指定数字为负数。试试-1
或-80000000
或其间的任何内容;他们会工作的。
答案 1 :(得分:0)
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,你就可以获得科学记数法的价值。