Почему разница между максимумом и минимумом целочисленного значения арифметически неверна? - PullRequest
0 голосов
/ 03 июня 2018

Почему следующие комбинации сложения или вычитания максимального и минимального целочисленных значений арифметически неверны?

public class Program
{
    public static void main(String[] args) {
        System.out.println(Integer.MIN_VALUE+" - "+Integer.MAX_VALUE+" = "+(long)(Integer.MIN_VALUE-Integer.MAX_VALUE));
                System.out.println(Integer.MAX_VALUE+" - "+Integer.MIN_VALUE+" = "+(long)(Integer.MAX_VALUE-Integer.MIN_VALUE));
//the only correct result                     System.out.println(Integer.MAX_VALUE+" + "+Integer.MIN_VALUE+" = "+(long)(Integer.MAX_VALUE+Integer.MIN_VALUE));
    }
 }

Выход

-2147483648 - 2147483647 = 1
2147483647 - -2147483648 = -1
2147483647 + -2147483648 = -1

1 Ответ

0 голосов
/ 03 июня 2018

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

Long result = Integer.MIN_VALUE+" - "+Integer.MAX_VALUE+" = "+(((long)Integer.MIN_VALUE)- Integer.MAX_VALUE)); // There is explicit type coersion. 
...