Typumwandlung
Als Typumwandlung (englisch type conversion oder type casting) wird in der Informatik die Umwandlung eines Datentyps in einen anderen bezeichnet, um eine Typverletzung zu vermeiden, die durch mangelnde Zuweisungskompatibilität gegeben ist.
Hierbei unterscheidet man zwischen
- expliziter und impliziter Typumwandlung;
- werterhaltender und verlustbehafteter Typumwandlung;
- benutzerdefinierter und vordefinierter (“built-in”) Typumwandlung.
Bei der expliziten Typumwandlung wird die Typumwandlung im Programmcode ausdrücklich hingeschrieben. Je nach Typisierung der verwendeten Programmiersprache kann das Fehlen der expliziten Angabe der Typumwandlung einen Laufzeit- oder Compilezeit-Fehler zur Folge haben.
Im Unterschied dazu erscheinen implizite Typumwandlungen nicht im Quelltext. Sie werden entweder nach durch die jeweilige Programmiersprache vorgegebenen Vorschriften oder gemäß einem vom Programmierer an einer anderen Stelle im Quelltext festgelegten Verfahren durchgeführt. Dadurch gelten sie als potenzielle Fehlerquelle, wenn sie unabsichtlich verwendet werden. Viele Programmiersprachen, wie z. B. Java, führen implizite Typumwandlung nur dann durch, wenn sie ohne Informationsverlust erfolgen kann, also wenn der Zieldatentyp einen gleichen oder größeren Wertebereich hat als der Ausgangsdatentyp.
Typerweiterung und Typeinschränkung
Da unterschiedliche Datentypen oftmals unterschiedliche Wertebereiche haben, können bei der Typumwandlung Typerweiterungen (also Vergrößerungen des Wertebereichs, type promotion) oder Typeinschränkung (also Verkleinerungen, type demotion) vorkommen.
Wird beispielsweise ein Integer mit einer Größe von 16 Bit in einen 32 Bit großen Integer umgewandelt, handelt es sich um eine Typerweiterung. Im umgekehrten Fall wäre dies eine Typeinschränkung.
Beispiel in Java
// Explizite Typumwandlung
int i = 100;
byte b = (byte) i;
// Implizite Typumwandlung
int j = 12;
double d = j;
// Bei Zeichenketten wird beim expliziten Casten String.valueOf(x)
// bzw. bei Objekten x.toString() aufgerufen:
int i = 164;
String str = String.valueOf(i);
// Implizite Typumwandlung bei Zeichenketten
int i = 164;
String str = "" + i;
// Implizite Typumwandlung als Fehlerquelle
int g = 9;
double e = g/2; // e ist nicht 4.5, sondern 4.0, da der zweite Operand eine Ganzzahl ist.
// Daher wird eine Ganzzahldivison durchgeführt und deren Ergebnis ist 4.
// Anschließend findet erst die Typumwandlung auf double statt und e weist den Wert 4.0 auf
// Um dieses Verhalten zu umgehen, muss der zweite Operand als Gleitkommazahl gekennzeichnet werden
// z. B. indem man statt der 2 eine 2.0 schreibt
int z = 9;
double y = z/2.0;
// oder wieder eine explizite Typumwandlung benutzt
int z = 9;
double y = z/(double)2;
Einzelnachweise