Typkonvertierungen

<-- zurck zur Startseite | <- eine Seite vor | eine Seite weiter ->

  1. erweiternde Konvertierungen
  2. einschränkende Konvertierungen
  3. Troubleshooting
  4. Übung
  5. Lösung

Was aber, wenn man nun einen "short"-Wert hat, daraus aber gern eine Integer- Variable machen will? Fr diese Zwecke gibt es in Java Typumwandlungen.
Man unterscheidet dabei 2 verschiedene Umwandlungen:

nach oben

2. erweiternde Konvertierungen

Diese liegt beispielsweise vor, wenn ich aus einer "int"-Variable ein "long" machen will, also von der "kleineren" Variable zur größeren will. Das schöne daran ist, dass der Compiler uns i.d.R. die Arbeit abnimmt:
addiert man z.B. einen Integer-Zahl mit einer Long-Zahl, so wird das Ergebnis automatisch "long":

int i = 345;
long j = 54489726388;
long ergebnis = i+j;

Folgende Erweiterungen nimmt der Compiler vor:

byte --> short --> int --> long --> float --> double

Wie man jetzt schon erahnen kann, können Ganzzahlen ganz leicht zu Kommazahlen erweitert werden: addiert man ein "int" mit einem "double", so wird das Ergebnis "double".
Ein "char" wird in diesem Kontext übrigens zu einem "int" und nicht zu "short", wie es die Bit-Zahl andeuten würde (das hängt damit zusammen, dass "char" nicht vorzeichenbehaftet ist und so den positiven Bereich eines "short"-Datentyps übersteigt).

nach oben

3. einschränkende Konvertierungen

Hier wird die Sache schon problematischer: nimmt man die obige Kette, dann geht es jetzt in die entgegengesetzte Richtung. Aus einer Fließkommazahl lässt sich nicht so ohne weiteres eine Ganzzahl herstellen. Zumindest nimmt uns der Compiler diese Arbeit nicht mehr ab, sondern müssen sie von Hand erledigen. Dazu gibt es den sog. Type-Cast. Man schreibt in Klammern vor das Ergebnis/die Variable, welchen Datentyp man gerne hätte. Ziffern, die nicht mehr in den (kleineren) Wertebereich habe, werden hierbei allerdings abgeschnitten! Ein Beispiel:

double beispiel = 2.56;
System.out.println("Wert: " + beispiel);
// Konvertierung nach float
float bsp1 = (float)beispiel;
System.out.println("Wert: " + bsp1);
// Konvertierung nach int
int bsp2 = (int)beispiel;
System.out.println("Wert: " + bsp2);

nach oben

4. Troubleshooting

Folgendes ist zu beachten: Eine Fließkommazahl ist erstmal grundsätzlich "double"! Das liegt daran, dass der Wert, der der Variablen zugewiesen wird, ein sog. Literal ist. Ein Literal ist eine Konstante, die als Ganzzahl immer vom Typ "int", als Kommazahl vom Typ "double" und als Wortzeichen (zwischen einfachen Hochkommata) ein "char" ist:

float beispiel = 2.56;

Hier würde der Compiler einen Fehler ausspucken ("possible loss of precision" = "möglicher Genauigkeitsverlust"). Diesen Fehler kann man auf zweierlei Arten beheben:

a) einen Type-Cast, wie gehabt:

float beispiel = (float)2.56;

b) ein Krzel am Ende der Zahl, das den Datentyp anzeigt:

float beispiel = 2.56f;

"f" zeigt eine "float"-Variable an, "d" entsprechend "double" und "l" eine "long"-Variable!
Wichtig: Während sich die "Kürzel-Methode" nur für Literale anbietet, können mit "Type-Casts" auch Variablen im Typ geändert werden. Wir werden dies noch öfter sehen.

Es folgt ein Fehler, der auch oft gern gemacht wird:

int ergebnis = (int)2.5+1.5;

Hier wird der Compiler wieder das meckern anfangen. Warum, wir haben doch einen Cast durchgeführt? Ja, aber nicht auf das Ergebnis der Addition, sondern auf den ersten Summanden! Und ein "int" addiert mit einem "double" ergibt nun einmal ein "double". Richtig wäre, das Ergebnis zu klammern, um anzuzeigen, dass es zusammengehört:

int ergebnis = (int)(2.5+1.5);

Und gleich noch ein Problem:

double ergebnis = 5/2;
System.out.println("Wert: " + ergebnis);

Hier werden wir nicht 2.5 als Ergebnis bekommen, sondern 2.0! Warum? Wenn eine Ganzzahl durch eine Ganzzahl geteilt wird, dann ist das Ergebnis ebenfalls eine Ganzzahl, hier nämlich 2. Der Compiler nimmt dann eine erweiternde Konvertierung nach "double" vor und Ergebnis ist 2.0.
So kann man den Compiler überlisten:

double ergebnis = 5.0/2.0;

Jetzt teilt der Compiler zwei "double"-Zahlen und das Ergebnis ist wie gewünscht 2.5! Übrigens ist das Ergebnis einer Division von Kommazahlen immer "double", auch wenn man "float"-Variablen teilt!

nach oben

5. Übung

Berechne mit einem Java-Programm folgende Aufgabe!
Ein Auto verbraucht im Schnitt 6,5 Liter Diesel. Der Tank fasst 47 Liter. Wie weit kommt die alte Kiste?

nach oben

6. Lösung

public class Fahrstrecke {

  public static void main(String[] args) {
    System.out.println();
    System.out.println(" geg: 6,5L auf 100km");
    System.out.println("      47L Tankvolumen");
    System.out.println(" ges: Fahrstrecke");
    float verbrauch = (float)6.5;
    float volumen = 47;
    float ergebnis = (volumen / verbrauch) * 100;
    System.out.println();
    System.out.println();
    System.out.println("Loesung: 6,5 / 47 * 100");
    System.out.println("Mit einer Tankfuellung kann man " + ergebnis + "km weit fahren.");
  }

}

Eventuell könnte man noch das Ergebnis auf Integer casten, wenn man an dieser Stelle viele Kommastellen als unschön erachtet. Der einfache Aufruf von System.out.println() erzeugt übrigens einen ganz normalen Zeilenumbruch. Die Methoden "print" und "println" in Java entsprechen den Funktionen "Write" und "WriteLn" in Pascal.

nach oben