Popularne konwersje arytmetyczne
Większość operatorów języka C wykonuje konwersje typów, aby przenieść operandy wyrażenia do wspólnego typu lub rozszerzyć krótkie wartości do rozmiaru całkowitego używanego w operacjach maszynowych. Konwersje wykonywane przez operatory języka C zależą od określonego operatora i typu operandów lub operandów. Jednak wiele operatorów wykonuje podobne konwersje na operandy typów całkowitych i zmiennoprzecinkowych. Te konwersje są nazywane "konwersjami arytmetycznymi". Konwersja wartości operandu na zgodny typ nie powoduje zmiany jego wartości.
Konwersje arytmetyczne podsumowane poniżej są nazywane "zwykłymi konwersjami arytmetycznymi". Te kroki są stosowane tylko dla operatorów binarnych, które oczekują typu arytmetycznego. Celem jest uzyskanie typowego typu, który jest również typem wyniku. Aby określić, które konwersje rzeczywiście mają miejsce, kompilator stosuje następujący algorytm do operacji binarnych w wyrażeniu. Poniższe kroki nie są kolejnością pierwszeństwa.
Jeśli którykolwiek operand ma typ
long double
, drugi operand jest konwertowany na typlong double
.Jeśli powyższy warunek nie jest spełniony, a żaden operand jest typu
double
, drugi operand jest konwertowany na typdouble
.Jeśli powyższe dwa warunki nie są spełnione, a operand jest typu
float
, drugi operand jest konwertowany na typfloat
.Jeśli powyższe trzy warunki nie zostaną spełnione (żaden z operandów nie zawiera typów zmiennoprzecinkowych), konwersje całkowite są wykonywane na operandach w następujący sposób:
Jeśli którykolwiek operand ma typ
unsigned long
, drugi operand jest konwertowany na typunsigned long
.Jeśli powyższy warunek nie jest spełniony, a operand jest typu
long
, a drugi typunsigned int
, oba operandy są konwertowane na typunsigned long
.Jeśli powyższe dwa warunki nie są spełnione, a operand jest typu
long
, drugi operand jest konwertowany na typlong
.Jeśli powyższe trzy warunki nie są spełnione, a operand jest typu
unsigned int
, drugi operand jest konwertowany na typunsigned int
.Jeśli żaden z powyższych warunków nie zostanie spełniony, oba operandy są konwertowane na typ
int
.
Poniższy kod ilustruje te reguły konwersji:
float fVal;
double dVal;
int iVal;
unsigned long ulVal;
dVal = iVal * ulVal; /* iVal converted to unsigned long
* Uses step 4.
* Result of multiplication converted to double
*/
dVal = ulVal + fVal; /* ulVal converted to float
* Uses step 3.
* Result of addition converted to double
*/