Als
Programmierer erwartet man intuitiv, dass eine Initialisierung wie die der
Variablen d
in den Zeilen
void f( int i_in )
{
double d = i_in; //
OK!
...
}
ohne weiteres funktioniert. Dass dabei eine Typwandlung von int nach double
erforderlich ist, soll den Programmierer nicht interessieren: der Compiler
soll die erforderliche Wandlung selbständig einfügen. In der Regel ist eine
Wandlung von int
nach double
problemlos, da sie normalerweise werterhaltend (value-preserving) durchgeführt werden kann. Den Fall, dass ein
bestimmter integraler Wert nicht exakt als Flieskommazahl repräsentiert werden
kann, muss jedoch prinzipiell bedacht werden (s.u.).
Nicht mehr ganz so einfach ist es im umgekehrten Fall: die
Initialisierung eines int
mit einem double
wirft Fragen auf. Welchen Wert soll i nach der Anweisung
int i = 2.999;
erhalten? In Frage kommen theoretisch die Werte 2 und 3. Sowohl Auf- als auch
Abrunden produziert ein falsches Ergebnis, d.h. die Konvertierung kann nicht
werterhaltend durchgeführt werden.
Eine weitere Variante liegt bei der Anweisungsfolge
void f( long l_in )
{
int i = l_in; //
???
...
}
vor. Ist der Wert von l_in
klein genug, kann er problemlos in ein int gewandelt werden. Ist long jedoch ein breiterer
Datentyp als int,
können entsprechend große long-Werte
auftreten, die nicht mehr in einem int repräsentiert werden können.
Ein ähnlicher Fall liegt bei einer Konvertierung von int nach char vor:
void f( int i_in )
{
char c =
i_in; // ???
...
}
Der Standard macht für alle diese Fälle Aussagen, wie die Konvertierungen
ablaufen sollen. Die Vorschriften sind „erwartungsgemäß“, d.h. es sollte immer
das Naheliegendste passieren. Wir behandeln diese sog. Standardkonvertierungen daher nur kurz.