BigInteger когда-либо переполняется? - PullRequest
11 голосов
/ 29 января 2010

В документации API написано

Все детали в спецификации, касающиеся переполнения, игнорируются, так как BigIntegers сделаны настолько большими, насколько это необходимо для учета результатов операции.

Означает ли это, что BigInteger никогда не переполнится, если у вас достаточно памяти? Если так, то почему мы допускаем переполнение некоторых типов, а некоторые нет?

По мере развития языка предпочтут ли он типы, скрывающие механизм переполнения от программистов?

Ответы [ 5 ]

13 голосов
/ 29 января 2010

BigInteger никогда не переполнится, если у вас достаточно памяти для его обработки.

Чтобы ответить на ваш вопрос, почему мы допускаем переполнение одних типов, а не других:

BigInteger на самом деле не тип. Это класс. Это класс-оболочка, разработанный для того, чтобы предоставить вам ту же функциональность, что и int, но позволяет вам использовать числа настолько большого размера, насколько вам нужно, не беспокоясь о переполнении.

Типы переполняются, потому что они представляют собой просто пару байтов (точный объем зависит от типа) памяти, и, как только этот небольшой объем памяти переполняется, также поступают числа.

Нет класса "переполнения", если он специально не предназначен для этого (или если у вас закончились ресурсы). Класс определен с достаточным объемом памяти для всего, что он содержит, что в основном будет ссылками на другие классы или другие структуры данных.

5 голосов
/ 29 января 2010

Вы правильно прочитали , оно никогда не переполнится. Хотя, это не создаст больше оперативной памяти для вас:)

Семантика арифметических операций точно имитировать те из целого числа Java арифметические операторы, как определено в Спецификация языка Java. За Например, деление на ноль создает ArithmeticException и деление отрицательный положительным дает отрицательный (или нулевой) остаток. Все детали в спецификации, касающиеся переполнение игнорируется, так как BigIntegers сделаны настолько большими, насколько это необходимо для приспособить результаты работа.

2 голосов
/ 29 января 2010

Если так, то почему мы допускаем переполнение некоторых типов, а некоторые нет?

Это полностью зависит от того, как оно поддерживается. Если он поддерживается, например, простым ванильным примитивом int, то он явно переполнится на Integer.MAX_VALUE. Примитивы имеют четкие границы переполнения, а границы для объектов зависят от того, как они защищены / запрограммированы.

2 голосов
/ 29 января 2010

Правильно, BigInteger никогда не переполняется, он использует программные операции и динамическое распределение для хранения чисел произвольного размера.

Как и во всех вычислениях, «произвольный размер» - это еще один способ сказать «пока у вас не закончатся ресурсы в базовой системе».

2 голосов
/ 29 января 2010

BigInteger никогда не переполняется! Это произвольный размер, поэтому он может вместить столько, сколько может вместить ваша память (и куча Java).

...