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 illformed.
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 illformed.
2) Otherwise, if either operand is of floatingpoint 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 nonfloatingpoint type, that operand is converted to the type of the other operand.
3) Otherwise, if the floatingpoint conversion ranks of the types of the operands are ordered but not equal, then the operand of the type with the lesser floatingpoint conversion rank is converted to the type of the other operand.
4) Otherwise, if the floatingpoint conversion ranks of the types of the operands are equal, then the operand with the lesser floatingpoint conversion subrank is converted to the type of the other operand.
5) Otherwise, the expression is illformed.
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 floatingpoint 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) 
Floatingpoint conversion rank and subrankFloatingpoint conversion rankEvery floatingpoint type has a floatingpoint conversion rank defined as follows:
Floatingpoint conversion subrankFloatingpoint types that have equal floatingpoint conversion ranks are ordered by floatingpoint conversion subrank. The subrank forms a total order among types with equal ranks. The types UsageThe floatingpoint conversion rank and subrank are also used to

(since C++23) 