Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke
Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke
Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>E<strong>in</strong>e</strong> <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> Informatik <strong>und</strong> <strong>die</strong> <strong>Programmiersprache</strong> C<br />
7.7.2 Explizite Typumwandlung (cast-operator)<br />
Die implizite Typumwandlung kann zu Fehlern, oder zum<strong>in</strong>dest zu unerwünschten Ergebnissen<br />
führen. Dies kann durch Ändern der Variablentypen oder durch explizite Typumwandlungen mit<br />
dem Castoperator (gegen <strong>die</strong> Compilerregeln sozusagen) umgangen werden. Mit dem Castoperator<br />
kann e<strong>in</strong>e Typumwandlung erzwungen werden. Der Castoperator besteht aus e<strong>in</strong>em <strong>in</strong> Klammern<br />
e<strong>in</strong>geschlossenen gültigen Datentyp. Der Castoperator hat e<strong>in</strong>e hohe Priorität <strong>und</strong> b<strong>in</strong>det se<strong>in</strong> rechtes<br />
Argument, im Zweifelsfall empfiehlt es sich dennoch, Klammern zu setzen.<br />
Achtung, mit dem Castoperator können auch grössere Datentypen <strong>in</strong> Kle<strong>in</strong>ere gezwängt werden.<br />
Der Programmierer ist aber selbst dafür verantwortlich, dass dabei ke<strong>in</strong>e Daten verlorengehen oder<br />
unerwünschte Ergebnisse entstehen:<br />
Umwandlung Bemerkungen<br />
Kle<strong>in</strong>er Integer <strong>in</strong> grossen Integer Ke<strong>in</strong>e Probleme<br />
Grosser Integer <strong>in</strong> kle<strong>in</strong>en Integer Höherwertige Bits werden abgeschnitten, falsches Ergebnis<br />
wenn Zahl ausserhalb Wertebereich<br />
Unsigned <strong>in</strong> Signed Falsches Ergebnis wenn Zahl ausserhalb Wertebereich<br />
Signed <strong>in</strong> Unsigned Falsches Ergebnis bei negativen Zahlen<br />
Float nach Integer Auf maximalen Wert gesättigt falls Zahl ausserhalb Wertebereich,<br />
Nachkommastellen werden abgeschnitten.<br />
Integer nach Float Kaum Probleme, ev. gehen Stellen verloren<br />
Kle<strong>in</strong>er Float nach grossem Float Ke<strong>in</strong>e Probleme.<br />
Grosser Float nach kle<strong>in</strong>em Float Auf maximalen Wert gesättigt falls Zahl ausserhalb Wertebereich,<br />
es gehen Stellen verloren.<br />
Po<strong>in</strong>ter nach Float Verboten<br />
Float nach Po<strong>in</strong>ter Verboten<br />
Po<strong>in</strong>ter auf A nach Po<strong>in</strong>ter auf B Zeiger behalten Adresse, Speicher<strong>in</strong>halt wird anders <strong>in</strong>terpretiert<br />
Po<strong>in</strong>ter nach Integer Integer enthält Adresse als Wert, sofern sie Platz hat, sonst nur<br />
Teil von Adresse<br />
Integer nach Po<strong>in</strong>ter Wert wird <strong>in</strong> Adresse umgewandelt<br />
In gleichen Typ mit anderen Qua- Ke<strong>in</strong>e Probleme (Wenn man weiss was man tut)<br />
lifizierern<br />
(z.B. volatile <strong>in</strong>t <strong>in</strong> <strong>in</strong>t, oder <strong>in</strong>t <strong>in</strong> const <strong>in</strong>t)<br />
Beispiele:<br />
<strong>in</strong>t a = 5, b = 2;<br />
float f = 0.0;<br />
<strong>in</strong>t c = 257;<br />
f = a / b; /* f ist 2 !!!! nicht etwa 2.5 weshalb? */<br />
f = (float) a / b; /* jetzt ist f 2.5 */<br />
f = (float) (a / b); /* jetzt ist f wieder 2 */<br />
b = (char)c; /* b ist nun 1, weshalb?? */<br />
f = a / 3.0; /* f ist jetzt 1.6666666 weshalb?? */<br />
c = a / 3.0; /* c ist jetzt 1 weshalb?? */<br />
c = a / 3.0 + 0.5; /* c ist jetzt 2 weshalb?? */<br />
c = a / 3 + 0.5; /* c ist jetzt 1 weshalb?? */<br />
Gedruckt am 11.09.2008 13:04:00 Letzte Änderung am: 11. September 2008 Version 2.4, I. Oesch 29/147