Sie sind hier: Buchauszüge Typwandlungen  
 BUCHAUSZÜGE
Vorwort
Inhaltsverzeichnis
Einführung
Typwandlungen

STANDARDKONVERTIERUNGEN
 
&&

Standardkonvertierungen sind Typwandlungen, die in der Sprache für Werte von fundamentalen Typen definiert sind. Standardkonvertie­rungen laufen grundsätzlich implizit ab, d.h. ohne Zutun des Pro­grammierers. Wir behalten in der folgenden Aufzählung die engli­schen Beschreibungen bei, da sie sich nur schlecht ins Deutsche übersetzen lassen.

qintegral promotions

     Werte der Typen (signed/unsigned) char oder (signed­/un­signed) 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 un­signed 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[1].

·         Kann der Zieltyp den Wert des Quelltyps nicht repräsentie­ren und der Zieltyp ist signed, macht der Standard keine Vorschriften, wie das Ergebnis auszusehen hat: das Ergeb­nis ist implementierungsabhängig (aber wohldefiniert): der Compilerbauer muss seine Lösung dokumentieren.

·         Kann der Zieltyp den Wert des Quelltyps nicht repräsentie­ren und der Zieltyp ist unsigned, wird die modulo-Arith­metik angewendet. Wandelt man also einen Wert x in ei­nen 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 un­signed-Typen niemals überlaufen können: Ein nicht repräsentier­bares (weil zu großes) Ergebnis einer Rechnung wird in wohldefi­nierter 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 wie­der 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 Ty­pen 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 Flies­kommatypen 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 Zei­gers 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.

 



[1]      Die übliche Breite von 8 Bit pro char vorausgesetzt.




Einführung | Zeiger und Referenzen