Rechnen mit int-Werten
Hintergrund
Bevor das Ergebnis einer Berechnung einer Variablen zugewiesen wird, wird es im Hauptspeicher zwischengespeichert. In dem dafür vorgesehenen Speicherbereich können jedoch grundsätzlich nur Werte vom Typ int abgelegt werden. Nur wenn in der Berechnung ein Datentyp vorkommt, dessen Wertebereich größer ist, wird für den Zwischenspeicher stattdessen dieser Datentyp verwendet.
Mögliche Probleme
- Bei der Division zweier int-Werte kann ein Dezimalbruch entstehen. Wird das Ergebnis zwischengespeichert, gehen dabei die Nachkommastellen verloren.
-
Bei der Addition, Subtraktion und Multiplikation zweier int-Werte kann das Ergebnis außerhalb des Wertebereichs für den Typ int liegen.
Ist das Ergebnis größer als der Wertebereich, wird der Betrag, um den das Ergebnis den größten zulässigen int-Wert übersteigt, zum kleinsten zulässigen Wert addiert und dieser Wert als Ergebnis zwischengespeichert.
Ist das Ergebnis kleiner als der Wertebereich, wird der Betrag, um den das Ergebnis kleiner als der kleinste zulässige int-Wert ist, zum kleinsten zulässigen Wert addiert und dieser Wert als Ergebnis zwischengespeichert.
Lösung
Zunächst müssen wir klären, in welchem Wertebereich sich das Ergebnis bewegt. Dann müssen wir dafür sorgen, dass der Speicherbereich, der das Zwischenergebnis aufnimmt, Werte des entsprechenden Typs aufnehmen kann. Dazu wandeln wir einen der beteiligten int-Werte in diesen Typ um.
-
Division zweier int-Werte
- Anstelle einer ganzen Zahl wird in der Formel ein entsprechender Dezimalbruch, zum Beispiel 2.0, verwendet.
- Durch das Anfügen des Buchstaben 'd' an eine ganze Zahl, wird die Zahl als double-Wert behandelt, zum Beispiel 2d.
- Explizite Typumwandlung mit Hilfe eines des cast-Operators1 (double), der dem umzuwandelnden Ausdruck vorangestellt wird. Der cast-Operator besteht aus dem gewünschten Typ, der von runden Klammern eingeschlossen wird, zum Beispiel (double)2 oder (double)intVariable.
Beispiel
JAVAdouble a;
a = 5 / 2; //a = 2
a = 5.0 / 2; //a = 2.5
a = 5 / 2.0; //a = 2.5
a = 5.0 / 2.0; //a = 2.5
a = 5d / 2; //a = 2.5
a = 5 / 2d; //a = 2.5
a = 5d / 2d; //a = 2.5
a = (double)5 / 2; //a = 2.5
a = 5 / (double)2; //a = 2.5
a = (double)5 / (double)2; //a = 2.5
Abb. 1: Division zweier ganzen Zahlen JAVAdouble a;
int b = 5;
int c = 2;
a = b / c; //a = 2
a = (double)b / c; //a = 2.5
a = b / (double)c; //a = 2.5
a = (double)b / (double)c; //a = 2.5
Abb. 2: Division zweier Variablen vom Typ int -
Addition, Subtraktion und Multiplikation zweier int-Werte
- Durch das Anfügen des Buchstaben 'l' (Ein kleines 'L') an eine ganze Zahl, wird die Zahl als long-Wert behandelt, zum Beispiel 2l.
- Explizite Typumwandlung mit Hilfe eines des cast-Operators1 (long), zum Beispiel (long)2 oder (long)intVariable.
Beispiel
JAVAlong a;
int b = -2147483648; //kleinster zulässiger int-Wert
int c = 2147483647; //größter zulässiger int-Wert
//Ergebnis liegt nicht im Wertebereich eines int-Werts
a = b - 1; //a = 2.147.483.647
a = c + 1; //a = -2.147.483.648
a = c * 2; //a = -2
//Lösung: Mindestens ein Wert muss vom Typ long sein
a = b - 1l; //a = -2.147.483.649
a = (long)c + 1; //a = 2.147.483.648
a = (long)c * 2; //a = 4.294.967.294Abb. 3: Addition, Subtraktion und Multiplikation zweier int-Werte
| Typ | Inhalt | Speicherbedarf | Wertebereich | Beispiel |
|---|---|---|---|---|
| int | ganze Zahl | 4 Byte | [-2.147.483.648; 2.147.483.647] | int anzahl = 4; |
| long | ganze Zahl | 8 Byte | [- 9.223.372.036.854.775.808; 9.223.372.036.854.775.807] | int anzahl = 4l; |
| double | Gleitkommazahl2 | 8 Byte | [-1,7 *10308; 1,7 *10308] | double pi = 3.1415927; |
Die explizite Typumwandlung wird mit Hilfe eines entsprechenden cast-Operators1 durchgeführt, der dem umzuwandelnden Ausdruck vorangestellt wird. Der cast-Operator selbst besteht aus dem gewünschten Typ, der von runden Klammern eingeschlossen wird.