Udostępnij za pośrednictwem


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:

  • Jeśli jeden z operandów jest typu unsignedlong, to drugi operand jest konwertowany na typ unsigned long.

  • Jeśli powyższy warunek nie jest spełniony i jeden z operandów jest typu long, a drugi unsignedint, to oba operandy są konwertowane na typ unsigned long.

  • Jeśli dwa powyższe warunki nie są spełnione i jeden z operandów jest typu long, to drugi operand jest konwertowany na typ long.

  • Jeśli trzy powyższe warunki nie są spełnione i jeden z operandów jest typu unsigned int, to drugi operand jest konwertowany na typ unsigned int.

  • Jeśli żaden z powyższych warunków nie jest spełniony, oba operandy są konwertowane na typ int.

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.

Zobacz też

Informacje

Konwersje standardowe