Integer min en max waarden

Ik ben een beginner in programmeren. Ik studeerde uit een Java-objectprogrammeerboek en voerde de tutorials en voorbeelden uit het boek tegelijkertijd op de computer uit.
In het boek staat dat de maximale en minimale waarde van gehele getallen zijn;

Integer.MAX_VALUE = 2147483647
Integer.MIN_VALUE = -2147483648

Dus oké. er is hier geen probleem, maar;
er staat dat als we 1 optellen bij de maximale waarde en 1 aftrekken van het minimum;

class test {
public static void main(String[] args) {
int min = Integer.MIN_VALUE -1;
int max = Integer.MAX_VALUE +1;
int a = min - 1;
int b = max + 1;
System.out.println("min - 1 =" + a);
System.out.println("max - 1 =" + b);
}
}

dus vinden we;

min - 1 = 2147483646
max + 1 = -2147483647

en er staat dat dit resultaat komt omdat het binaire proces in het geheugen is beperkt tot 32 bits.
Het ding dat ik niet kon begrijpen. Is het in het stuk code niet het optellen en aftrekken van 2 respectievelijk van de maximale en minimale waarden?;

   int min = Integer.MIN_VALUE -1; // subtracted 1 here
int max = Integer.MAX_VALUE +1; // added 1 here
int a = min - 1;  // subtracted 1 here
int b = max + 1; // added 1 here

Antwoord 1, autoriteit 100%

Houd er rekening mee dat aInteger.MAX_VALUE - 1is en bInteger.MIN_VALUE + 1is. Dus ja, het is inderdaad in elk geval tweemaal 1 aftrekken en optellen. Het boek is niet verkeerd, maar het is een stomme manier om les te geven over wrap-around overflow. Alleen het afdrukken van Integer.MIN_VALUE - 1en Integer.MAX_VALUE + 1zou het punt hebben gemaakt.

int min = Integer.MIN_VALUE -1; // min is set to Integer.MAX_VALUE by underflow
int max = Integer.MAX_VALUE +1; // max is set to Integer.MIN_VALUE by overflow

Van de Java-taal Specificatie, §15.18.2:

Als een optelling van gehele getallen overloopt, is het resultaat de lage-orde bits van de wiskundige som zoals weergegeven in een voldoende groot twee-complement-formaat.

De JLS is de ultieme autoriteit als het gaat om dit soort vragen, maar ik raad het niet aan om het te lezen als een manier om Java te leren. Je kunt beter de Java Language Tutorialdoornemen. Het is vrij uitgebreid en de inhoud is van zeer hoge kwaliteit.

Other episodes