06.10.2013 Aufrufe

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

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!