Obvyklé aritmetické převody
Většina operátorů jazyka C provádí převody typů tak, aby operandy výrazu přenesly na běžný typ nebo aby rozšířily krátké hodnoty na celočíselnou velikost použitou v operacích počítače. Převody prováděné operátory jazyka C závisí na konkrétním operátoru a typu operandu nebo operandů. Mnoho operátorů však provádí podobné převody na operandy integrálních a plovoucích typů. Tyto převody se označují jako "aritmetické převody". Převod hodnoty operandu na kompatibilní typ způsobí, že se nezmění jeho hodnota.
Níže shrnuté aritmetické převody se nazývají "obvyklé aritmetické převody". Tyto kroky se použijí pouze pro binární operátory, které očekávají aritmetický typ. Účelem je získat běžný typ, který je také typem výsledku. Chcete-li zjistit, které převody skutečně proběhnou, kompilátor použije následující algoritmus na binární operace ve výrazu. Následující kroky nejsou pořadí priorit.
Je-li jeden operand typu
long double
, druhý operand je převeden na typlong double
.Pokud výše uvedená podmínka není splněna a jeden operand je typu
double
, druhý operand je převeden na typdouble
.Pokud výše uvedené dvě podmínky nejsou splněny a jeden operand je typu
float
, druhý operand je převeden na typfloat
.Pokud nejsou splněny výše uvedené tři podmínky (žádný z operandů není typu s plovoucí desetinou čárkou), pak se na operandech provádějí integrální převody následujícím způsobem:
Je-li jeden operand typu
unsigned long
, druhý operand je převeden na typunsigned long
.Pokud výše uvedená podmínka není splněna a jeden operand je typu
long
a druhý typunsigned int
, oba operandy jsou převedeny na typunsigned long
.Pokud výše uvedené dvě podmínky nejsou splněny a jeden operand je typu
long
, druhý operand je převeden na typlong
.Pokud výše uvedené tři podmínky nejsou splněny a operand je typu
unsigned int
, druhý operand je převeden na typunsigned int
.Pokud nejsou splněny žádné z výše uvedených podmínek, oba operandy se převedou na typ
int
.
Následující kód ilustruje tato pravidla převodu:
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
*/