Usual arithmetic conversions
Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield result types in a similar way. The purpose is to yield a common type, which is also the type of the result. This pattern is called the usual arithmetic conversions.
Contents |
[edit] Definition
Usual arithmetic conversions are defined as follows:
1) If either operand is of type long double, the other operand is converted to long double.
2) Otherwise, if either operand is double, the other operand is converted to double.
3) Otherwise, if either operand is float, the other operand is converted to float.
4) Otherwise, integral promotions are performed on both operands.
5) Then, if either operand is unsigned long, the other operand is converted to unsigned long.
6) Otherwise, if one operand is long and the other operand is unsigned int, then if a long can represent all the values of an unsigned int, the unsigned int operand is converted to a long; otherwise both operands are converted to unsigned long.
7) Otherwise, if either operand is long, the other operand is converted to long.
8) Otherwise, if either operand is unsigned int, the other operand is converted to unsigned int.
|
(until C++11) |
1) If either operand is of scoped enumeration type, no conversions are performed; if the other operand does not have the same type, the expression is ill-formed.
2) Otherwise, if either operand is of type long double, the other operand is converted to long double.
3) Otherwise, if either operand is double, the other operand is converted to double.
4) Otherwise, if either operand is float, the other operand is converted to float.
5) Otherwise, integral promotions are performed on both operands. Then the following rules are applied to the promoted operands:
1) If both operands have the same type, no further conversion is needed.
2) Otherwise, if both operands have signed integer types or both have unsigned integer types, the operand with the type of lesser integer conversion rank is converted to the type of the other operand.
3) Otherwise, one operand is of an signed integer type
S , the other operand is of an unsigned integer type U . The follwing rules apply:1) If the integer conversion rank of
U is greater than or equal to the integer conversion rank of S , the operand of type S is converted to U .2) Otherwise, if
S can represent all of the values of U , the operand of type U is converted to S .3) Otherwise, both operands are converted to the unsigned integer type corresponding to S .
|
(since C++11) (until C++23) |
1) If either operand is of scoped enumeration type, no conversions are performed; if the other operand does not have the same type, the expression is ill-formed.
2) Otherwise, if either operand is of floating-point type, the following rules are applied:
1) If both operands have the same type, no further conversion is needed.
2) Otherwise, if one of the operands is of a non-floating-point type, that operand is converted to the type of the other operand.
3) Otherwise, if the floating-point conversion ranks of the types of the operands are ordered but not equal, then the operand of the type with the lesser floating-point conversion rank is converted to the type of the other operand.
4) Otherwise, if the floating-point conversion ranks of the types of the operands are equal, then the operand with the lesser floating-point conversion subrank is converted to the type of the other operand.
5) Otherwise, the expression is ill-formed.
3) Otherwise, integral promotions are performed on both operands. Then the following rules are applied to the promoted operands:
1) If both operands have the same type, no further conversion is needed.
2) Otherwise, if both operands have signed integer types or both have unsigned integer types, the operand with the type of lesser integer conversion rank is converted to the type of the other operand.
3) Otherwise, one operand is of an signed integer type
S , the other operand is of an unsigned integer type U . The follwing rules apply:1) If the integer conversion rank of
U is greater than or equal to the integer conversion rank of S , the operand of type S is converted to U .2) Otherwise, if
S can represent all of the values of U , the operand of type U is converted to S .3) Otherwise, both operands are converted to the unsigned integer type corresponding to S .
|
(since C++23) |
If one operand is of enumeration type and the other operand is of a different enumeration type or a floating-point type, this behavior is deprecated. |
(since C++20) |
Integer conversion rankEvery integer type has an integer conversion rank defined as follows:
The integer conversion rank is also used in the definition of integral promotion. |
(since C++11) |
Floating-point conversion rank and subrankFloating-point conversion rankEvery floating-point type has a floating-point conversion rank defined as follows:
Floating-point conversion subrankFloating-point types that have equal floating-point conversion ranks are ordered by floating-point conversion subrank. The subrank forms a total order among types with equal ranks. The types UsageThe floating-point conversion rank and subrank are also used to
|
(since C++23) |