# Was passiert bei einem Overflow von zwei Integer



## glitsch (3. Okt 2012)

Hi zusammen

Als Beginner habe ich mir die Frage gestellt, was passiert bei folgender Operation:


```
int a = 2147483647;
int b = 2147483647;
System.out.print(a+b);
```

Das geht logischerweise über den Wertebereich hinaus. Wieso kommt da -2 dabei rau? Und wieso kommt da 2147483645 dabei raus, wenn ich nochmal ein a oder b dazu addiere? Danach wechselt es sich ab nach dem Schema: Ungerade runter und Gerade runter im Zahlenstrahl. ???:L


----------



## Camill (3. Okt 2012)

Es kommt zu einem "Über- bzw. Unterlauf". Lass dir folgendes mal ausgeben:

```
System.out.println("MAX: " + Integer.MAX_VALUE);
	System.out.println("MIN: " + Integer.MIN_VALUE);

	System.out.println("MAX + 1 = " + (Integer.MAX_VALUE + 1));
	System.out.println("MIN - 1 = " + (Integer.MIN_VALUE - 1));
```


----------



## Firephoenix (3. Okt 2012)

Stell dir keinen Zahlenstrahl sondern einen Kreis vor für den Überlauf, das passt besser.

der größte Int ist 2147483647, addierst du darauf +1 erhälst du -2147483648

du addierst aber statt 1 genau 2147483647, also bekommst du als ergebnis

-2147483648 + 2147483647 -1 (für den Überlauf) = -2

Gruß


----------



## glitsch (3. Okt 2012)

Alles klaro. Habs gepeilt. Danke für die recht anschauliche Methodik. Dann sind also die Wertebereiche in sich geschlossen in/auf/an einem Kreis. Jetzt bitte nicht lachen, aber auch hier frage ich mich, was hat das genau auf sich? Wieso sagt man nicht einfach: ist nicht mehr definiert im Speicher oder Wertebereich? 

Sehr fein und ich dachte, ich muss mich jetzt mit der Relativitätstheorie auseinandersetzen, um das zu begreifen... :lol:


----------



## Firephoenix (3. Okt 2012)

Das Überlaufsystem ist tiefer verankert durch den PC selber, würde man vor jeder Rechnung den Wertebereich prüfen würde dein PC wohl nicht so schnell arbeiten ^^

Das Hauptproblem dabei ist das Speichersystem für negative zahlen, in der Regel macht man das mit einem Vorzeichenbit, und das flippt bei zu großen Additionen eben, hier gibt es ein Beispiel dazu:
Ganzzahlüberlauf ? Wikipedia

Gruß


----------



## turtle (3. Okt 2012)

Da musst Du unterscheiden zwischen Integer bzw. FloatingPoint-Arithmetik.

Aus Performancegründen wird bei Integerarithmetik selten geprüft, ob der Wertebereich noch gültig ist. Daher die Analogie zu einem Kreis, wo das Addieren einer Eins plötzlich das Resultat eine negative Zahl ergibt. Da wird häufig auch eine Exception geworfen.

```
System.out.println( 1/0 );
Exception in thread "main" java.lang.ArithmeticException: / by zero
```
Bei FloatingPoint-Arithmetik gibt es dagegen die "Spezial"werte positiv unendlich, negativ unendlich und einen Hinweis, dass das Ergbnis nicht als Zahl dargestellt werden kann (NaN = Not a number).

Letzters zum Beispiel Wurzel von -4

```
System.out.println( Math.sqrt(-4) );
```
Ist hier nochmal beschrieben.


----------



## Pentalon (3. Okt 2012)

Hi glitsch

Der Overflow bedeutet, dass eine Zahl in ihrer Variable nicht mehr Platz hat.
Wenn man das INT nimmt, so reserviert hier JAVA 4 Byte bzw. 32 Bit dafür.
Um besser Einblick zu bekommen, warum das passiert, was passiert, muss man sich die Zahlen in dem Zahlensystem ansehen, mit dem der Computer arbeitet, also binär, bzw. auch hex das ist ein bisserl einfacher zu lesen und kann einfach im Kopf auf Binär umgerechnet werden.

Ich was so frech und habe das Beispiel von weiter oben genommen und mit einigen zusätzlichen Ausgaben versehen:


```
public class Test {
	
	public static void main(String[] args) {

	    System.out.println("MAX: " + Integer.MAX_VALUE+" Hex: "+Integer.toHexString(Integer.MAX_VALUE)+" BIN "+Integer.toBinaryString(Integer.MAX_VALUE));
	    System.out.println("MIN: " + Integer.MIN_VALUE+" Hex: "+Integer.toHexString(Integer.MIN_VALUE)+" BIN "+Integer.toBinaryString(Integer.MIN_VALUE));
	 
	    System.out.println("MAX + 1 = " + (Integer.MAX_VALUE + 1)+" Hex: "+Integer.toHexString(Integer.MAX_VALUE+1)+" BIN "+Integer.toBinaryString(Integer.MAX_VALUE+1));
	    System.out.println("MIN - 1 = " + (Integer.MIN_VALUE - 1)+" Hex: "+Integer.toHexString(Integer.MIN_VALUE-1)+" BIN "+Integer.toBinaryString(Integer.MIN_VALUE-1));
	    
	    for(int a = 100; a > -100; a--)
	    	System.out.println("DEC "+a+" HEX "+Integer.toHexString(a)+" BIN "+Integer.toBinaryString(a));
	}
}
```

Wenn man das ganze auf Binärbasis ansieht, stellt man fest, dass die Zahl dann negativ wird, wenn das 32te Bit (also das oberste) auf 1 gesetzt wird. Damit ist auch schon erklärt warum ein einfaches Addieren von einer 1 zum MAX eine riesege negative Zahl erzeugt.

[TIPP]0111 1111.1111 1111.1111 1111.1111 1111 ist die grösstmögliche positive INT + 1 ergibt
1000 0000.0000 0000.0000 0000.0000 0000 das ist die kleinstmögliche negative INT.[/TIPP]

In HEX ist die grössmögliche negative INT 80 00 00 00h das 80 ist das oberste Byte und das sieht binär so aus 1000 0000. Das 8te Bit ist das Negativbit und steht hier auf 1.
In HEX ist die grösstmögliche positive INT 7F FF FF FFh das 7F ist das oberste Byte und das sieht binär so aus 0111 1111. Das Negativbit ist hier 0.
Die Restlichen FF sind alle 1111 1111.

Pentalon


----------

