Перегружается ли BigInteger?
В документах API говорится:
Все детали в Спецификации, касающиеся переполнения, игнорируются, поскольку BigIntegers сделаны настолько большими, насколько это необходимо для выполнения результатов операции.
Означает ли это, что BigInteger никогда не будет переполняться, если у вас будет достаточно памяти? Если да, то почему мы допускаем переполнение "типа", а некоторые нет?
Как язык развивается, будет ли он одобрять типы, которые скрывают переполняющий механизм от программистов?
Ответы
Ответ 1
BigInteger никогда не будет переполняться, если у вас достаточно памяти для его обработки.
Чтобы ответить на вопрос о том, почему мы допускаем переполнение типов, а не другие:
BigInteger на самом деле не тип. Это класс. Это класс-оболочка, созданный для того, чтобы предоставить вам ту же функциональность, что и int, но позволяет использовать числа, которые вам нужны, без беспокойства о переполнении.
Типы переполняются, потому что они всего лишь пара байтов (точное количество зависит от типа) памяти, и как только этот небольшой объем памяти переполняется, так и номера.
Нет класса "переполнения", если он специально не предназначен для этого (или если у вас закончились ресурсы). Класс определяется с достаточной памятью для всего, что он содержит, что будет в основном ссылкой на другие классы или другие структуры данных.
Ответ 2
Вы читайте правильно, он никогда не переполнится. Хотя, он не будет создавать больше ОЗУ для вас:)
Семантика арифметических операций точно имитировать те из целых чисел Java арифметические операторы, как определено в Спецификация языка Java. Для Например, деление на ноль бросает Арифметическое исключение и разделение отрицательным положительным, дает отрицательный (или нулевой) остаток. Все подробности в Спецификации относительно переполнение игнорируется, так как BigIntegers сделаны настолько большими, насколько это необходимо для учитывать результаты операции.
Ответ 3
BigInteger никогда не переполняется! Он имеет произвольный размер, поэтому он может содержать число, такое же большое, как и ваша память (и куча Java).
Ответ 4
Правильно, BigInteger никогда не переполняется, он использует программные операции и динамическое распределение для хранения чисел произвольного размера.
Как и во всех вычислениях, "произвольный размер" - это способ сказать "до тех пор, пока у вас не будет ресурсов из базовой системы".
Ответ 5
Если да, то почему мы допускаем переполнение "типа", а некоторые - нет?
Это полностью зависит от того, как оно поддерживается. Если это подкреплено, например, простой примитивой ванилью int
, то она, очевидно, будет переполняться в Integer.MAX_VALUE
. Примитивы имеют четкие границы переполнения, в то время как объекты для объектов зависят от того, как они защищены/запрограммированы.