Sdílet prostřednictvím


Aritmetické převody

Mnoho binárních operátorů (jak je popsáno v tématu Výrazy s binárními operátory) způsobuje převody operandů a vrací výsledky stejným způsobem.Způsob, jakým tyto operátory provádějí převody se nazývá „obvyklé aritmetické převody“. Aritmetické převody operandů různých nativních typů jsou prováděny, jak je znázorněno v následující tabulce.Typy typedef se chovají podle jejich základních nativních typů.

Podmínky pro převod typu

Splněné podmínky

Popis převodu

Každý operand je typu long double.

Další operand je převeden na typ long double.

Předcházející podmínka nebyla splněna a každý operand je typu double.

Další operand je převeden na typ double.

Předcházející podmínky nebyly splněny a každý operand je typu float.

Další operand je převeden na typ float.

Předcházející podmínky nebyly splněny (žádný z operandů není typ s plovoucí desetinnou čárkou).

Celočíselné povýšení je s těmito operandy provedeno následovně:

  • Je-li operand typu unsigned long, je další operand převeden na typ unsigned long.

  • Není-li předcházející podmínka splněna a pokud je jeden z operandů typu long a druhý operand je typu unsigned int, jsou oba operandy převedeny na typ unsigned long.

  • Nejsou-li splněny obě předcházející podmínky a pokud je jeden z operandů typu long, je druhý operand převeden na typ long.

  • Nejsou-li předchozí tři podmínky splněny a pokud je jeden z operandů typu unsigned int, je druhý operand převeden na typ unsigned int.

  • Není-li splněna žádná z předchozích podmínek, jsou oba operandy převedeny na typ int.

Následující kód ilustruje pravidla převodu, která jsou popsány v tabulce:

// 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;
}

První příkaz v předchozím příkladu znázorňuje násobení dvou celočíselných typů, iVal a ulVal.Podmínka je splněna, pokud ani jeden operand není typu s plovoucí desetinnou čárkou a jeden operand je typu unsigned int.Proto je druhý operand, iVal, převeden na typ unsigned int.Výsledek je přiřazen do proměnné dVal.Podmínka je splněna, pokud je jeden operand typu double, proto je výsledek násobení typu unsigned int převeden na typ double.

Druhý příkaz v předchozím příkladu znázorňuje sečtení typu float a celočíselného typu, fVal a ulVal.Proměnná ulVal je převedena na typ float (třetí podmínka v tabulce).Výsledek součtu je převeden na typ double (druhá podmínka v tabulce) a přiřazen do proměnné dVal.

Viz také

Referenční dokumentace

Standardní převody