[expr.arith.conv] (original) (raw)
7 Expressions [expr]
7.4 Usual arithmetic conversions [expr.arith.conv]
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.47
Then the following rules are applied to determine C:- If T1 and T2 are the same type, C is that type.
- Otherwise, if T1 and T2 are both signed integer types or are both unsigned integer types,C is the type with greater rank.
- Otherwise, let U be the unsigned integer type andS be the signed integer type.
* If U has rank greater than or equal to the rank of S,C is U.
* Otherwise, if S can represent all of the values of U,C is S.
* Otherwise,C is the unsigned integer type corresponding to S.