Это то, что меня всегда раздражало. Если вы инициализируете int шестнадцатеричным литералом, вы можете использовать полный диапазон положительных значений до 0xFFFFFF
; все, что больше 0x7FFFFF
, будет действительно отрицательным значением. Это очень удобно для маскировки битов и других операций, когда вас интересуют только местоположения битов, а не их значения.
Но если вы используете Integer.parseInt () для преобразования строки в целое число, все, что больше "0x7FFFFFFF"
, будет считаться ошибкой. Вероятно, есть веская причина, почему они сделали это таким образом, но это по-прежнему расстраивает.
Самый простой обходной путь - использовать Long.parseLong (), а затем привести результат к int.
int n = (int)Long.parseLong(s, 16);
Конечно, вам следует делать это только в том случае, если вы уверены, что число будет в диапазоне Integer.MIN_VALUE..Integer.MAX_VALUE
.