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

  1. Bei der Division zweier int-Werte kann ein Dezimalbruch entstehen. Wird das Ergebnis zwischengespeichert, gehen dabei die Nachkommastellen verloren.
  2. 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.

  1. 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
    JAVA
    double 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
    JAVA
    double 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
  2. 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
    JAVA
    long 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.294
    Abb. 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;
Abb. 4: Primitive Datentypen

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.

Merke: Explizite Typumwandlung