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*,
which are defined as follows:

- The lvalue-to-rvalue conversion ([conv.lval]) is applied to each operand and the resulting prvalues are used in place of the original operands for the remainder of this section.
- If either operand is of scoped enumeration type ([dcl.enum]), no conversions are performed; if the other operand does not have the same type, the expression is ill-formed.
- Otherwise, if one operand is of enumeration type and the other operand is of a different enumeration type or a floating-point type, the expression is ill-formed.
- Otherwise, if either operand is of floating-point type, the following rules are applied:
- If both operands have the same type, no further conversion is performed.
- Otherwise, if one of the operands is of a non-floating-point type, that operand is converted to the type of the operand with the floating-point type.
- Otherwise, if the floating-point conversion ranks ([conv.rank]) 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.
- 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 ([conv.rank]) is converted to the type of the other operand.
- Otherwise, the expression is ill-formed.

- Otherwise, each operand is converted to a common type C.The integral promotion rules ([conv.prom]) are used to determine a type T1 and type T2 for each operand.48Then the following rules are applied to determine C:
- Otherwise, if T1 and T2 are both signed integer types or are both unsigned integer types, C is the type with greater rank.