Потому что переполнение и двойной подсчет природы идут по «второму циклу», мы были в крайнем правом положении 2147483647, и после суммирования 1 мы оказались в крайнем левом положении -2147483648, следующее увеличение идет -2147483647, -2147483646, -2147483645, ... и так далее до крайнего правого снова и снова и снова, его природа суммирующей машины на этой разрядности.
Несколько примеров:
int a = 2147483647;
System.out.println(a);
дает: 2147483647
System.out.println(a+1);
дает: -2147483648 (поскольку переполнение и двойной подсчет природы идут по «второму циклу», мы были в крайнем правом положении 2147483647, и после суммирования 1 мы оказались в крайнем левом положении -2147483648, следующее увеличение идет -2147483648, - 2147483647, -2147483646, ... и так далее до самого правого снова и снова и снова, его природа суммирующей машины на этой разрядности)
System.out.println(2-a);
дает: -2147483645 (-2147483647+2 кажется математически логичным)
System.out.println(-2-a);
дает: 2147483647 (-2147483647-1 -> -2147483648, -2147483648-1 -> 2147483647 какой-то цикл, описанный в предыдущих ответах)
System.out.println(2*a);
дает: -2 (2147483647+2147483647 -> -2147483648+2147483646 снова математический логический)
System.out.println(4*a);
дает: -4 (2147483647+2147483647+2147483647+2147483647 -> -2147483648+2147483646+2147483647+2147483647 -> -2-2 (согласно последнему ответу) -> -4)`
person
Oleg Kamuz
schedule
29.05.2019
int b = -Integer.MIN_VALUE;
!! Математика дополнения 2 настолько запутана. - person djangofan   schedule 04.12.2016