Zum Inhalt springen

C-Programmierung: Typumwandlung

Aus Wikibooks

Der Typ eines Wertes kann sich aus verschiedenen Gründen ändern müssen. Beispielsweise, weil man unter Berücksichtigung höherer Genauigkeit weiter rechnen möchte, oder weil man den Nachkomma-Teil eines Wertes nicht mehr benötigt. In solchen Fällen verwendet man Typumwandlung (auch als Typkonvertierung bezeichnet).

Man unterscheidet dabei grundsätzlich zwischen expliziter und impliziter Typumwandlung. Explizite Typumwandlung nennt man auch Cast.

Eine Typumwandlung kann einschränkend oder erweiternd sein.

Implizite Typumwandlung

[Bearbeiten]

Bei der impliziten Typumwandlung wird die Umwandlung nicht im Code aufgeführt. Sie wird vom Compiler automatisch anhand der Datentypen von Variablen bzw. Ausdrücken erkannt und durchgeführt. Beispiel:

int i = 5;
float f = i; // implizite Typumwandlung

Offenbar gibt es hier kein Problem. Unsere Ganzzahl 5 wird in eine Gleitkommazahl umgewandelt. Dabei könnten die ausgegebenen Variablen zum Beispiel so aussehen:

5
5.000000

Die implizite Typumwandlung (allgemeiner Erweiternde Typumwandlung) erfolgt von kleinen zu größeren Datentypen.

Explizite Typumwandlung

[Bearbeiten]

Anders als bei der impliziten Typumwandlung wird die explizite Typumwandlung im Code angegeben. Es gilt folgende Syntax:

(Zieltyp)Ausdruck

Wobei Zieltyp der Datentyp ist, zu dem Ausdruck konvertiert werden soll. Beispiel:

float pi = 3.14159f;
int i = (int)pi; // explizite Typumwandlung

liefert i=3.

Die explizite Typumwandlung entspricht allgemein dem Konzept der Einschränkenden Typumwandlung.

Verhalten von Werten bei Typumwandlungen

[Bearbeiten]

Fassen wir zusammen. Wandeln wir int in float um, wird impliziert erweitert, d. h. es geht keine Genauigkeit verloren.

Haben wir eine float nach int Umwandlung, schneidet der Compiler die Nachkommastellen ab - Genauigkeit geht zwar verloren, aber das Programm ist in seiner Funktion allgemein nicht beeinträchtigt.

Werden allgemein größere in kleinere Ganzzahltypen umgewandelt, werden die oberen Bits abgeschnitten (es erfolgt somit keine Rundung!). Würde man versuchen einen Gleitpunkttyp in einen beliebigen Typ mit kleineren Wertebereich umzuwandeln, ist das Verhalten unbestimmt.