2013-11-21 2 views
2

Мне нужно прочитать в 32-разрядном номере в шестнадцатеричном формате. Когда я ввожу отрицательное значение, я получаю исключение несоответствия ввода. Все работает до тех пор, пока число положительное (00000000 ~ 7FFFFFFF), но что-то отрицательное (80000000 ~ FFFFFFFF) терпит неудачу.Сканер Java nextInt (16) не принимает отрицательные шестнадцатеричные значения

 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

Просто интересно, вы пробовали '-1'? – stackular

+0

Попробуйте '-A' ... вы получите' -10'. –

ответ

2

По этой же причине не удастся 2147483648 (один больше, чем 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 или что-нибудь среднее между ними; они будут работать.

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.

Смежные вопросы