Ваш код завершается ошибкой, потому что он пытается проанализировать число, которое потребует 33 бита для сохранения в виде целого числа со знаком.
Знаковое int
- это 32-битное значение в представлении дополнения до двух, где первый битбудет указывать знак числа, а оставшиеся 31 бит - значение числа.(-ish.) Java поддерживает только целые числа со знаком, и parseInt()
и друзья не должны анализировать битовые комбинации двух дополнений - и, таким образом, интерпретировать 1
или (возможно подразумеваемый) 0
в 32-й позиции справакак знакОни предназначены для поддержки анализа удобочитаемой репрезентации, которая является необязательной -
(или +
) для знака, за которым следует абсолютное значение числа.
В этом контексте этоложная интуиция, которая приводит вас к ожидаемому поведению, которое вы описываете: если вы анализируете любую другую базу, кроме базы 2 (или, возможно, других обычно используемых степеней двух), вы ожидаете первую цифруввода, чтобы повлиять на знак?Очевидно, что вы не будете;скажем, parseInt("2147483648")
return -2147483648
по проекту было бы PHP-уровнем сумасшествия.
В двухслойных базах специального корпуса тоже ощущается странность.Лучше иметь отдельный подход к обработке битовых комбинаций, например, тот, что в этот ответ .