Was passiert bei einem Overflow von zwei Integer

glitsch

Aktives Mitglied
Hi zusammen

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

Code:
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

Bekanntes Mitglied
Es kommt zu einem "Über- bzw. Unterlauf". Lass dir folgendes mal ausgeben:
Java:
	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));
 
F

Firephoenix

Gast
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

Aktives Mitglied
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:
 
F

Firephoenix

Gast
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

Top Contributor
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.
Java:
		 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
Java:
		 System.out.println( Math.sqrt(-4) );
Ist hier nochmal beschrieben.
 

Pentalon

Bekanntes Mitglied
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:

Java:
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
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Kann mir jemand wörtlich erklären, was in dem Code genau passiert? Java Basics - Anfänger-Themen 1
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
S Operatoren i=i++; Was passiert hier? Java Basics - Anfänger-Themen 21
N Enum Typen, was passiert intern mit ihnen? Java Basics - Anfänger-Themen 2
N Was passiert wenn wir Daten auf der Festplatte abspeichern wollen? bzgl. BufferStreams Java Basics - Anfänger-Themen 9
S Unklarer Code (was passiert hier?) Java Basics - Anfänger-Themen 1
T Kann mir jemand sagen, was bei folgender for-Schleife passiert? Java Basics - Anfänger-Themen 1
V Was passiert in dem Programm? Java Basics - Anfänger-Themen 3
B Was passiert in dieser Methode? Java Basics - Anfänger-Themen 3
W Was passiert mit Objekten die nicht in Objektvariablen initialisiert werden ? Java Basics - Anfänger-Themen 3
T boolean, was passiert hier? Java Basics - Anfänger-Themen 4
B Nichts passiert... Java Basics - Anfänger-Themen 4
C Klassen BubbleSort was passiert mit dem Index ? Java Basics - Anfänger-Themen 2
J Was passiert hier? Java Basics - Anfänger-Themen 6
D KeyListener, nichts passiert Java Basics - Anfänger-Themen 6
B Was passiert, wenn eine konkrete Klasse von generische Klasse erbt? Java Basics - Anfänger-Themen 14
F festlegen, was beim schließen des fensters passiert Java Basics - Anfänger-Themen 12
E DeSerialize von verändertem Object, was passiert? Java Basics - Anfänger-Themen 4
-horn- Was passiert, wenn Zähler über Integer Max läuft? Java Basics - Anfänger-Themen 9
G Was passiert mit eine Methode bei einer Instanz Java Basics - Anfänger-Themen 13
R Deklaration: was passiert da? Java Basics - Anfänger-Themen 3
G Was passiert "at compile time" Java Basics - Anfänger-Themen 3
M 2 Fragen: Vergleich, aber wie? Was passiert in diesem Teil? Java Basics - Anfänger-Themen 18
G Abstrakte Klasse (was passiert hier) Java Basics - Anfänger-Themen 3
G pow(double,double) was passiert bei pow(double,int) Java Basics - Anfänger-Themen 6
M Migration JUnit 3.8 -> 4.0, was passiert mit Testsuites? Java Basics - Anfänger-Themen 3
K Mehrere Werte in einem Switch Case parallel überprüfen Java Basics - Anfänger-Themen 23
Zrebna Fragen zu einem Klassendiagramm Java Basics - Anfänger-Themen 8
S HashMap mehrere Keys zu einem Value Java Basics - Anfänger-Themen 3
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
F 2x 16bit Werte zu einem 32bit und dann splitten mit 0xb Java Basics - Anfänger-Themen 1
J JSON mit einem JPanel Java Basics - Anfänger-Themen 3
F Einem GIT repository ein Projekt hinzufügen Java Basics - Anfänger-Themen 1
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
P Probleme mit NetBeans: Wie lässt sich jar. Datei an einem MacBook öffnen Java Basics - Anfänger-Themen 21
J Auf einem JLabel Linien Malen Java Basics - Anfänger-Themen 1
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
XWing Randomizer mit einem String Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
S Ausgeben wie oft ein Wert in einem Array vorkommt Java Basics - Anfänger-Themen 7
N Einzelne Werte aus einem TreeSet auslesen Java Basics - Anfänger-Themen 2
N Welche Objekte kann man zu einem Set hinzufügen Java Basics - Anfänger-Themen 4
Kumora ArrayIndexOutOfBoundsException bei einem Sortierverfahren Java Basics - Anfänger-Themen 2
I Viereck / Rechteck Prüfung innerhalb einem bestimmten Bereich Java Basics - Anfänger-Themen 2
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5
Substring in einem String finden Java Basics - Anfänger-Themen 13
J Fehlerbehandlung an einem Beispiel Java Basics - Anfänger-Themen 8
I ResultSet aus meiner SQL-Abfrage in einem JTextfield ausgeben. Java Basics - Anfänger-Themen 1
I Innerhalb einem Bild ein Teil austauschen Java Basics - Anfänger-Themen 26
I Dateigröße von einem InputStream oder byte[] bekommen Java Basics - Anfänger-Themen 2
H Compiler-Fehler Klasse in einem Package wird nicht gefunden bzw. akzeptiert Java Basics - Anfänger-Themen 12
S Algorithmus entwicklen, der zu einem gegebenen Datum die Jahreszeit ermittelt Java Basics - Anfänger-Themen 13
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Elemente in einem Array Java Basics - Anfänger-Themen 5
G Position einer unbekannten 3-stelligen-Zahl in einem String finden Java Basics - Anfänger-Themen 15
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
T Methode, die prüft ob in einem Int-Array maximal 2 Zahlen enthalten sind, die größer als ihr Vorgänger sind Java Basics - Anfänger-Themen 5
berserkerdq2 Wie gebe ich den Pfad zu einer Datei an, die in einem Ordner in Eclipse ist? Java Basics - Anfänger-Themen 1
M Objekt in einem Objekt speichern Java Basics - Anfänger-Themen 9
J Speichern von zwei Variablen durch Auslesen aus einem Numberfield Java Basics - Anfänger-Themen 2
L Gridmuster in einem Array Java Basics - Anfänger-Themen 2
D spezifische Knoten in einem Baum zählen Java Basics - Anfänger-Themen 9
X Erste Schritte Hilfe bei einem kleinen Spiel. Java Basics - Anfänger-Themen 19
O Array mit einem Zeichen vergleichen Java Basics - Anfänger-Themen 1
B Brauche Hilfe zu einem Code Java Basics - Anfänger-Themen 5
J Zahlen bis zu einem bestimmten Grenzwert ausgeben Java Basics - Anfänger-Themen 11
P9cman Vokale in einem String überprüfen mittels Rekursion Java Basics - Anfänger-Themen 8
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
M Wie kann ich in einem Konstruktor die Methode eines anderen Interfaces mit den jeweiligen Parametern aufrufen? Java Basics - Anfänger-Themen 8
Igig1 Wie lasse ich dir Werte in einem Array zusammenrücken? Java Basics - Anfänger-Themen 4
W Methode, die mit einem Datum arbeitet? Java Basics - Anfänger-Themen 22
Igig1 Welche Werte sind als default Werte in einem Array, der als Datentyp eine Klasse hat? Java Basics - Anfänger-Themen 1
Kiki01 Wie würde eine geeignete Schleife aussehen, die die relative Häufigkeit für jeden Charakter in einem Text bestimmt? Java Basics - Anfänger-Themen 3
C Hilfe bei einem Anfängerprojekt Java Basics - Anfänger-Themen 25
U Char zu einem String machen Java Basics - Anfänger-Themen 1
U Kann man bei Java gleich mehrere Bedingungen prüfen in der If, aber in einem "Satz"? Java Basics - Anfänger-Themen 1
Schniffi Nur bestimmte Bilder aus einem Array auf Image Button anzeigen lassen Java Basics - Anfänger-Themen 3
S Längster Pfad zwischen zwei Vertices in einem Graph Java Basics - Anfänger-Themen 3
I Upload File zu einem Webservice Java Basics - Anfänger-Themen 17
Naxon89 Input/Output Ein PDF in einem BLOB umwandeln um ihn dann als PDF wieder anzuzeigen Java Basics - Anfänger-Themen 3
Kotelettklopfer Mehrere Projekte in einem Git verwalten Java Basics - Anfänger-Themen 10
B in einem Array den nächstgelegenen Wert zu einem eingabewert finden Java Basics - Anfänger-Themen 8
E JPanels auf gleicher Höhe (Y-Achse) in einem FlowLayout platzieren Java Basics - Anfänger-Themen 7
N Aus einem String die Anzahl der Vokale auslesen Java Basics - Anfänger-Themen 40
C Programm das feststellen kann, ob eine eingegebene Zahl einem Schaltjahr entspricht, richtig geschrieben? Java Basics - Anfänger-Themen 11
M Von einem Menü Methode aus anderer Klasse ausführen, die errechnete Werte in Datei schreibt. Java Basics - Anfänger-Themen 8
A Zu einem bestimmten Ort im Code springen Java Basics - Anfänger-Themen 11
I Validation, ob String ein Wert aus einem Enum enthält Java Basics - Anfänger-Themen 3
B Häufigkeit einzelner Zahlen in einem Array Java Basics - Anfänger-Themen 6
D Zufällige Auswahl aus einem angelegten Array? Java Basics - Anfänger-Themen 10
A Löschen von Leerzeichen in einem char array ohne methoden Java Basics - Anfänger-Themen 6
T Methode schreiben, die einem Array ein Stringelement hinzufügt, wenn dieses noch nicht enthalten ist. Java Basics - Anfänger-Themen 6
TimoN11 IntelliJ , Ausgabe von einem Quellcode in Eingabe eines Quellcodes Java Basics - Anfänger-Themen 1
R Mehrere Buchstaben aus einem String entfernen Java Basics - Anfänger-Themen 1
J Alle .java Dateien von einem Verzeichnis in eine Zip speichern Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben