Typumwandlung


C++ ist wie C wesentlich nachsichtiger in der art der Behandlung von Ausdrücken, die mehrere verschiedene Datentypen betreffen, als es einige andere Programmiersprachen sind. Betrachten Sie dazu als Beispiel das Programm MIXED:

// mixed.cpp // Zeigt gemischte Austrücke #include <iostream.h> void main() { int count = 7 float avgWeight = 155.5; double totalWeight = count * avgWeight; cout << "totalWeight=" << totalWeight << endl; }

Im vorliegenden Beispiel wird eine Variable von Typ int mit einer Variable vom Typ float multipliziert, um ein Ergebnis vom Typ double zu liefern. Dieses Programm wird fehlerfrei übersetzt. Der Übersetzer betrachtet es als ganz normalen Vorgang, daß Sie Zahlen unterschiedlichen Datentyps miteinander multiplizieren (oder irgendeine andere arithmetische Operation ausführen) wollen.

Nicht alle Programmiersrachen sind so gelassen. Einige gestatten keine gemischten Ausdrücke und würden die Zeile in MIXED, welche die bewußte Rechenoperation ausführt, als Fehler anzeigen. Diese Sprachen unterstellen, daß Sie einen Fehler machen, wenn Sie Typen miteinander mischen, und sie versuchen, Sie davor zu bewahren. C++ und C nehmen dagegen an, daß Sie einen guten grund für Ihre Vorgehensweise haben, und sie helfen Ihnen dabei, Ihre Absichten durzuführen. Dies ist einer der Gründe für die Popularität von C und C++. Sie geben Ihnen mehr Freiheit beim Programmieren.


Rangfolge der Dtentypen

Datentyp Rang
long double (höchster)
double
float
long
int
char (niedrigster)

Nehmen Sie aber an, daß ein Zwischenergebnis auch nicht in den Wertebereich des vorzeichenlosen Datentyps passen wird. In solch einem Fall sind wir in der Lage, das Proplem durch den Einsatz eines Umwandlungsoperators zu lösen. Es folgt ein Beispiel:

// cast.cpp // Prüft vorzeichenbehaftete und vorzeichenlose Ganzzahlen #include <iostream.h> void main() { int intVar = 25000; // signed -32768 bis 32767 intVar = (intVar * 10) / 10; // Ergebnis ist zu groß cout << "intVar = " << intVar << endl; // Falsches Ergebnis intVar = 25000; intVar = (long(intVar) * 10) / 10; cout << "intVar = " << intVar << endl; // Richtiges Ergebnis }

Es folgt die ausgabe des Programms:

intVar = -1214
intVar = 25000

Die erste Antwort, ohne Umwandlungsoperator, ist falsch; aber bei der zweiten Antwort sorgt der Umwandlungsoperator für das richtige Ergebnis.(long)IntVar

mit den runden Klammern um den Datentyp schreiben, ansttt die Variable einzuklmmern.


13