Udostępnij za pośrednictwem


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.

  1. Jeśli którykolwiek operand ma typ long double, drugi operand jest konwertowany na typ long double.

  2. Jeśli powyższy warunek nie jest spełniony, a żaden operand jest typu double, drugi operand jest konwertowany na typ double.

  3. Jeśli powyższe dwa warunki nie są spełnione, a operand jest typu float, drugi operand jest konwertowany na typ float.

  4. 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 typ unsigned long.

    • Jeśli powyższy warunek nie jest spełniony, a operand jest typu long , a drugi typ unsigned int, oba operandy są konwertowane na typ unsigned long.

    • Jeśli powyższe dwa warunki nie są spełnione, a operand jest typu long, drugi operand jest konwertowany na typ long.

    • Jeśli powyższe trzy warunki nie są spełnione, a operand jest typu unsigned int, drugi operand jest konwertowany na typ unsigned 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
                      */

Zobacz też

Operatory języka C