Freigeben über


Arithmetische Konvertierungen

Viele binäre Operatoren (näher erläutert in Ausdrücke mit binären Operatoren) führen zu Konvertierungen von Operanden und erzielen auf die gleiche Weise Ergebnisse. Die Art und Weise der Konvertierung durch diese Operatoren wird als "übliche arithmetische Konvertierungen" bezeichnet. Arithmetische Konvertierungen von Operanden unterschiedlicher systemeigener Typen werden entsprechend der Darstellung in der folgenden Tabelle ausgeführt. Typedef-Typen verhalten sich entsprechend ihren zugrunde liegenden systemeigenen Typen.

Bedingungen für die Typkonvertierung

Bedingungen erfüllt

Conversion

Jeder Operand ist vom Typ long double.

Anderer Operand wird in Typ long double konvertiert.

Vorangehende Bedingung nicht erfüllt und jeder Operand ist vom Typ double.

Anderer Operand wird in Typ double konvertiert.

Vorangehende Bedingungen nicht erfüllt und jeder Operand ist vom Typ float.

Anderer Operand wird in Typ float konvertiert.

Vorausgehende Bedingungen nicht erfüllt (keiner der Operanden ist vom Typ "floating").

Ganzzahlige Erweiterungen werden bei den Operanden wie folgt ausgeführt:

  • Wenn einer der beiden Operanden vom Typ unsigned long ist, wird der andere Operand in den Typ unsigned long umgewandelt.

  • Wenn die vorherige Bedingung nicht erfüllt ist, und wenn einer der beiden Operanden vom Typ long und der andere vom Typ unsigned int ist, werden beide Operanden in den Typ unsigned long konvertiert.

  • Wenn die vorherigen beiden Bedingungen nicht erfüllt sind, und wenn ein Operand vom Typ long ist, wird der andere Operand in den Typ long umgewandelt.

  • Wenn die vorherigen drei Bedingungen nicht erfüllt sind, und wenn ein Operand vom Typ unsigned int ist, wird der andere Operand in den Typ unsigned int umgewandelt.

  • Wenn keine der vorherigen Bedingungen erfüllt ist, werden beide Operanden in den Typ int konvertiert.

Das folgende Codebeispiel veranschaulicht die Konvertierungsregeln, die in der Tabelle beschrieben werden:

// arithmetic_conversions.cpp
double dVal;
float fVal;
int iVal;
unsigned long ulVal;

int main() {
   // iVal converted to unsigned long
   // result of multiplication converted to double
   dVal = iVal * ulVal;

   // ulVal converted to float
   // result of addition converted to double
   dVal = ulVal + fVal;
}

Die erste Anweisung im vorangehenden Beispiel zeigt die Multiplikation von zwei ganzzahligen Typen, nämlich iVal und ulVal. Die erfüllte Bedingung besteht darin, dass keiner der Operanden unverankert ist und ein Operand den Typ unsigned int aufweist. Daher wird der andere Operand, iVal, in den Typ unsigned int konvertiert. Das Ergebnis wird dVal zugewiesen. Die erfüllte Bedingung besteht darin, dass ein Operand den Typ double aufweist. Daher wird das unsigned int-Ergebnis der Multiplikation in den Typ double konvertiert.

Die zweite Anweisung im vorhergehenden Beispiel zeigt die Addition eines float- und eines Ganzzahltyps, fVal und ulVal. Die ulVal-Variable wird in den float-Typ konvertiert (dritte Bedingung in der Tabelle). Das Ergebnis der Addition wird in den Typ double konvertiert (zweite Bedingungen in der Tabelle) und dVal zugewiesen.

Siehe auch

Referenz

Standardkonvertierungen