Я создаю обратный польский калькулятор и у меня проблемы с насыщенностью. Я реализовал стек и обнаружил, что наибольшее число, которое я могу получить, не имея проблемы, равно 2147483647. Поэтому, если я помещу это число в стек, а затем добавлю 1, я получу результат -2147483648< /сильный> (отрицательный). Что мне нужно сделать, так это вместо возврата этого отрицательного числа вернуть исходный номер 2147483647. В основном это ограничение. То же самое относится и к отрицательной стороне вещей, где предел составляет -2147483648. Дайте мне знать, если я пропустил какую-либо информацию или вам нужно увидеть код.
Проблема с насыщением после вычислений в Java
Ответы (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
Кажется, я не мог заставить его решение работать? Используя двойные числа, я возвращаюсь с этим 2.147483647E9. Есть идеи?
- person George Burslem; 26.11.2015
@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