Какой диапазон значений у int в Java
Что проверяют
Базовое знание языка и, главное, понимание переполнения. Сам диапазон называют за секунду, поэтому следом спрашивают, что будет при Integer.MAX_VALUE + 1 и как это поймать.
Как отвечать
int в Java это 32-битное целое со знаком в дополнительном коде. Диапазон от -2147483648 до 2147483647, то есть от минус 2^31 до 2^31 минус единица, это константы Integer.MIN_VALUE и Integer.MAX_VALUE. Размер зафиксирован спецификацией языка и не зависит от платформы и разрядности JVM, в отличие от int в C.
Затем то, что отличает хороший ответ:
- переполнение молчаливое:
Integer.MAX_VALUE + 1даётInteger.MIN_VALUE, исключения нет; - проверяемая арифметика:
Math.addExact,Math.multiplyExact,Math.toIntExactбросаютArithmeticExceptionвместо тихого переворота; - асимметрия:
Math.abs(Integer.MIN_VALUE)возвращает отрицательное число, потому что положительной пары у минимума нет; - беззнаковые операции: с Java 8 есть
Integer.toUnsignedString,Integer.divideUnsigned,Integer.compareUnsigned; - кеш
Integer:Integer.valueOfотдаёт закешированные объекты для значений от-128до127, поэтому==на обёртках работает на маленьких числах и ломается на больших; - соседи:
byte8 бит,short16,long64,char16 бит без знака. Для денег и больших счётчиков берутlongилиBigDecimal.
Если есть время, приведите практический пример: счётчик миллисекунд в int переполняется примерно через 24,8 суток, отсюда баги с таймаутами и аптаймом.
Где спотыкаются
Пишут компаратор, который возвращает разность a и b. На больших по модулю значениях разность переполняется и сортировка выходит неверной, правильно Integer.compare(a, b).
Считают середину в бинарном поиске как (low + high) / 2. Когда индексы переваливают за миллиард, сумма уходит в минус, безопаснее (low + high) >>> 1.
Думают, что long x = a * b для двух int спасает от переполнения. Умножение выполняется в int и переполняется до присваивания, один из множителей нужно заранее привести к long.