Standardkonvertierungen
sind Typwandlungen, die in der Sprache für Werte von fundamentalen Typen
definiert sind. Standardkonvertierungen laufen grundsätzlich implizit ab, d.h. ohne Zutun des Programmierers.
Wir behalten in der folgenden Aufzählung die englischen Beschreibungen bei, da
sie sich nur schlecht ins Deutsche übersetzen lassen.
qintegral promotions
Werte
der Typen (signed/unsigned)
char
oder (signed/unsigned)
short, bool sowie
Bitfelder können in einen Wert des Typs int gewandelt werden. Kann ein int nicht alle Werte eines
solchen Typs aufnehmen, kann eine Wandlung in unsigned int erfolgen.
Werte des Typs bool
werden in die Werte 0
bzw 1
gewandelt. Für Bitfelder ist eine Wandlung nur möglich, wenn das Bitfeld
ausreichend klein ist, so dass alle Werte in einem (unsigned) int repräsentiert werden können.
qfloating point promotion
float-Werte
können in double-Werte
gewandelt werden. Der Wert bleibt erhalten.
qintegral conversions
Werte
integraler Typen sowie Werte von Aufzählungen können in Werte anderer
integraler Typen gewandelt werden. Beispiele sind: unsigned int nach int, int nach char, int nach unsigned int etc. Dabei gelten folgende
Regeln:
·
Kann der Zieltyp den Wert des Quelltyps repräsentieren,
bleibt der Wert erhalten. Beispiele: Wandlung int nach unsigned int für Werte >=0.
Wandlung von int
nach char
für Werte <=255.
·
Kann der Zieltyp den Wert des Quelltyps nicht repräsentieren
und der Zieltyp ist signed,
macht der Standard keine Vorschriften, wie das Ergebnis auszusehen hat: das
Ergebnis ist implementierungsabhängig (aber wohldefiniert): der Compilerbauer
muss seine Lösung dokumentieren.
·
Kann der Zieltyp den Wert des Quelltyps nicht
repräsentieren und der Zieltyp ist unsigned, wird die modulo-Arithmetik angewendet. Wandelt man also einen Wert x in einen
Typ T,
ist das Ergebnis x
mod Tmax+1, wobei Tmaxder
größte in T
repräsentierbare Wert ist.
Beispiel:
In der Anweisung
unsigned char c = 259;
wird
die int-Größe
259 in
einen unsigned char-Wert
gewandelt. Unter der Annahme, dass ein char 8 Bit hat beträgt der Wertebereich 0..255. Die
Variable c
erhält also den Wert 259
mod 256 = 3.
Beachten
Sie bitte, dass aus dem letzten Punkt auch folgt, dass unsigned-Typen niemals
überlaufen können: Ein nicht repräsentierbares (weil zu großes) Ergebnis einer
Rechnung wird in wohldefinierter Weise (eben durch die modulo-Arithmetik) auf
einen repräsentierbaren Wert getrimmt. Schreibt man also z.B.
unsigned int i=0;
while ( true )
i++;
durchläuft i zunächst alle Werte des
Wertebereiches um dann wieder bei 0 zu beginnen. Das Verhalten dieser
Endlosschleife ist vom Standard also wohldefiniert.
qfloating-integral conversions
Werte
von Fließkommatypen können in Werte von integralen Typen konvertiert werden.
Dabei findet immer ein Abschneiden der Nachkommastellen statt. Ist der
Wertebereich des Zieltyps zu klein um das Ergebnis (nach dem Abschneiden)
aufzunehmen, ist das Verhalten undefiniert.
Beispiel: In den
Anweisungen
int i = 2.1415; //
OK
int k = 1e99; //
???
erhält i den Wert 2, der Wert von k ist undefiniert.
Umgekehrt können Werte
von integralen Typen in Werte von Flieskommatypen gewandelt werden. Wenn
möglich wird dabei der Wert erhalten. Es kann theoretisch allerdings auch der
Fall auftreten, dass eine exakte Wandlung nicht möglich ist. In diesem Fall ist
das Ergebnis entweder immer die nächstgrößere oder nächstkleinere mögliche Fließkommazahl.
qbool-conversion
Ein
Wert eines integralen Typs, einer Aufzählung oder eines Zeigers kann in einen
Wert vom Typ bool
gewandelt werden. Eine Größe mit dem Wert 0 (bzw. der Nullzeiger) wird
in den Wert false
gewandelt, alles andere in den Wert true.