Hi Leute,
Dieses kleine Programm erzeugt einen Overflow. Fängt Java nicht eigentlich Overflows ab?
Das Programm findet ihr in dem Buch Thinking in Java von Bruce Eckel (www.bruceeckel.com)
(Sollte man sich eigentlich mal angucken)
Interessant finde ich die Art, wie Java mit Ganzzahlen umgeht und damit rechnet, ich habe herrausgefunden, dass
Java einen overflow nur bei einer Rechnung mit Integer-Werten zulässt. Der Grund dafür ist, dass
Java bei einer Rechnung zweier Integer-Typen (byte, short, int, long) von einer Integer Operation ausgeht.
Das bedeutet, doch aber, das Java wenn der Wert für eine 32-bit Integervariable zu hoch ist, einen long für das
Ergebnis verlangen müsste, aber wieso macht er das hier nicht?
Schreibt man ein ähnliches Programm mit shortvariabeln, dann verlangt Java für das Ergebnis ein Int.
Folgender Quelltext zeigt das:
Dieses Programm kann nicht compiliert werden und erzeugt folgenden Fehler:
Seltsam finde ich auch, dass ein Programm sich nicht compilieren lässt, wenn man einer Longvariable ihren maximalen Wert zuweist. Dann bekommt man die Fehlermeldung: Integer number too long.
Kann es sein, das Java bei Ganzzahlen auch in Zuweisungen von Integerwerten ausgeht?
gruß krenke
Code:
class Overflow {
public static void main (String[] args) {
int big = 0x7FFFFFFF;
System.out.println("big = "+big);
int bigger = big * 4;
System.out.println("bigger = "+bigger);
}
}
Dieses kleine Programm erzeugt einen Overflow. Fängt Java nicht eigentlich Overflows ab?
Das Programm findet ihr in dem Buch Thinking in Java von Bruce Eckel (www.bruceeckel.com)
(Sollte man sich eigentlich mal angucken)
Interessant finde ich die Art, wie Java mit Ganzzahlen umgeht und damit rechnet, ich habe herrausgefunden, dass
Java einen overflow nur bei einer Rechnung mit Integer-Werten zulässt. Der Grund dafür ist, dass
Java bei einer Rechnung zweier Integer-Typen (byte, short, int, long) von einer Integer Operation ausgeht.
If all of the operands of an operator are of an integer type, the operation is performed as an integer operation. Normally, integer operations are performed with a precision of 32 bits. If at least one of the operands of an integer operation is a long, however, the operation is performed with a precision of 64 bits.
When an integer operation overflows or underflows, there is no indication given that the overflow or underflow occurred.
Aus Java Language Reference von O'Reilly
Das bedeutet, doch aber, das Java wenn der Wert für eine 32-bit Integervariable zu hoch ist, einen long für das
Ergebnis verlangen müsste, aber wieso macht er das hier nicht?
Schreibt man ein ähnliches Programm mit shortvariabeln, dann verlangt Java für das Ergebnis ein Int.
Folgender Quelltext zeigt das:
Code:
class Overflow {
public static void main (String[] args) {
short big = 32767;
short bigger = big*4;
System.out.println("bigger = "+bigger);
}
}
Dieses Programm kann nicht compiliert werden und erzeugt folgenden Fehler:
Das beweist demnach die These, das Java bei Rechnungen von einer Int-Operation ausgeht, man könnte das Ergebnis falls nicht zu groß, also in short- oder bytewerte casten.overflow.java [4:1] possible loss of precision
found : int
required: short
short bigger = verybig*4;
^
1 error
Errors compiling overflow.
Seltsam finde ich auch, dass ein Programm sich nicht compilieren lässt, wenn man einer Longvariable ihren maximalen Wert zuweist. Dann bekommt man die Fehlermeldung: Integer number too long.
Kann es sein, das Java bei Ganzzahlen auch in Zuweisungen von Integerwerten ausgeht?
gruß krenke