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 operandach 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 jeden z operandów ma typ
long double
, drugi operand jest konwertowany na typlong double
.Jeśli powyższy warunek nie zostanie spełniony, a jeden z operandów jest typu
double
, drugi operand jest konwertowany na typdouble
.Jeśli powyższe dwa warunki nie są spełnione, a jeden z operandów jest typu
float
, drugi operand jest konwertowany na typfloat
.Jeśli powyższe trzy warunki nie zostaną spełnione (żaden z operandów nie ma typów zmiennoprzecinkowych), konwersje całkowite są wykonywane na operandach w następujący sposób:
Jeśli jeden z operandów ma typ
unsigned long
, drugi operand jest konwertowany na typunsigned long
.Jeśli powyższy warunek nie zostanie spełniony, a albo 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 jeden z operandów jest typu
long
, drugi operand jest konwertowany na typlong
.Jeśli powyższe trzy warunki nie są spełnione, a jeden z operandów 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 zostaną przekonwertowane na typ
int
.
Poniższy kod ilustruje następujące 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ż
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla