Konwersje arytmetyczne
Wiele operatorów binarnych (omówionych w Wyrażenia zawierające operatory binarne) powoduje konwersje operandów i daje wyniki w ten sam sposób.Sposób, w jaki operatory te powodują konwersje jest nazywany "typowe konwersje arytmetyczne". Konwersje arytmetyczne operandów o różnych typach natywnych są wykonywane jak pokazano w poniższej tabeli.Typy typedef zachowują się zgodnie z ich podstawowymi typami natywnymi.
Warunki dotyczące konwersji typów
Spełnione warunki |
Konwersja |
---|---|
Jeden z operandów jest typu longdouble. |
Drugi operand jest konwertowany na typ longdouble. |
Powyższy warunek nie jest spełniony, a oba operandy są typu double. |
Drugi operand jest konwertowany na typ double. |
Powyższe warunki nie są spełnione, a oba operandy są typu float. |
Drugi operand jest konwertowany na typ float. |
Powyższe warunki nie są spełnione (żaden z operandów nie jest typu zmiennoprzecinkowego). |
Promocje typów całkowitych są wykonywane na operandach w następujący sposób:
|
Następujący kod ilustruje reguły konwersji opisane w tabeli:
// 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;
}
Pierwsza instrukcja w powyższym przykładzie pokazuje mnożenie dwóch typów całkowitych: iVal i ulVal.Spełniony jest warunek, że żaden z operandów nie jest typu zmiennoprzecinkowego i jeden z operandów jest typu unsigned int.Z tego powodu, drugi operand iVal jest konwertowany na typ unsigned int.Wynik jest przypisany do dVal.Spełniony jest warunek, że jeden z operandów jest typu double; z tego powodu, wynik mnożenia unsigned int jest konwertowany na typ double.
Druga instrukcja w powyższym przykładzie pokazuje dodawanie typu float i całkowitego: fVal i ulVal.Zmienna ulVal jest konwertowana na typ float (trzeci warunek określony w tabeli).Wynik dodawania jest konwertowany na typ double (drugi warunek określony w tabeli) i przypisywany do dVal.