Проблема с насыщением после вычислений в Java

Я создаю обратный польский калькулятор и у меня проблемы с насыщенностью. Я реализовал стек и обнаружил, что наибольшее число, которое я могу получить, не имея проблемы, равно 2147483647. Поэтому, если я помещу это число в стек, а затем добавлю 1, я получу результат -2147483648< /сильный> (отрицательный). Что мне нужно сделать, так это вместо возврата этого отрицательного числа вернуть исходный номер 2147483647. В основном это ограничение. То же самое относится и к отрицательной стороне вещей, где предел составляет -2147483648. Дайте мне знать, если я пропустил какую-либо информацию или вам нужно увидеть код.


person George Burslem    schedule 26.11.2015    source источник


Ответы (1)


Наибольшее значение int – 2147483647, а наименьшее – -2147483648. Значения int повторяются, поэтому, когда вы добавляете 1 к 2147483647, вы получаете -2147483648, а когда вы вычитаете 1 из -2147483648, вы получаете 2147483647.

Если вы не хотите такого поведения, вы можете сделать

int a = 2147483647;
a += 1.0;                   // a is still 2147483647

or

int a = 2147483647;
int b = (int) (a + 1.0);    // b is also 2147483647

Они работают, потому что a + 1.0 вычисляется с использованием double (без переполнения), а результат преобразуется обратно в int по правилу, согласно которому числа больше Integer.MAX_VALUE просто становятся Integer.MAX_VALUE.

person Paul Boddington    schedule 26.11.2015
comment
Кажется, я не мог заставить его решение работать? Используя двойные числа, я возвращаюсь с этим 2.147483647E9. Есть идеи? - person George Burslem; 26.11.2015
comment
@GeorgeBurslem Нет, это не сработает, если у вас есть переменные типа double. Все переменные должны иметь тип int. Если вам нужно решение с использованием int, вы можете сделать int b = a == Integer.MAX_VALUE ? a : a + 1;, чтобы добавить 1, и int c = a == Integer.MIN_VALUE ? a : a - 1;, чтобы вычесть 1. - person Paul Boddington; 26.11.2015