Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Переполнение int в java

#java


Есть код

int a = Integer.MAX_VALUE;
int b = 5000;
int c = 123;
int min = Math.min(a, Math.min(b,c));
int max = Math.max(a, Math.max(b,c));
int d = a + b + c - min - max;


Почему в переменной d сохраняется правильное значение ( b )? 

Ведь когда мы делаем a + b ( Integer.MAX_VALUE + 5000) у нас будет переполнение int'a
    


Ответы

Ответ 1



Да нет, все правильно. Вместе с переполнениями так и получается. Рассчитаем по шагам: int step1 = a+b+c; System.out.println(step1); int step2 = step1-min; System.out.println(step2); int d = step2 - max; System.out.println(d); Выводится: -2147478526 -2147478649 5000 Просто на последнем шаге происходит второе переполнение -2147478649 -2147483647 и получается 5000. P.S. Вообще, наличие переполнения не влияет на ассоциативность операции сложения. В Java сложение значений одного целого типа всегда ассоциативно, о чем упомянуто в спецификации (§JLS 15.18.2): Integer addition is associative when the operands are all of the same type. Соответственно, для любых a и b значение a + b - b будет равно a. Из этого следует, что в Вашем случае d всегда будет равно среднему по величине из трех чисел (a, b и c) независимо от их значений.

Ответ 2



грубо говоря возьмём более простой восьмибитный тип: [-127; 128] - диапазон значений. если к 128 + 1 в восьмибитной переменной - получится -127. так и у вас: int a = Integer.MAX_VALUE; int b = a + 5000; тут b будет равно Integer.MIN_VALUE + 4999, т.к. произошло переполнение.

Комментариев нет:

Отправить комментарий