次のタイプの変数を使用した割り当てがあるとします。
uint64 = uint16 + uint16 + uint32 + uint64
すべての作業が uint64 を使用して行われている限り、結果の r 値が uint64 内に収まることがわかっていると仮定します。
コンパイラは、標準の C 規則に従って計算を行う前に、2 つの uint16 と uint32 を暗黙的に uint64 に昇格させますか?
すなわち
1.)uint64 = uint16 + uint16 + uint32 + uint64
2.)uint64 = uint64 + uint64 + uint64 + uint64
具体的には、次のスニペットの 2 番目のステートメントを適用します。
両方のオペランドが同じ型の場合、それ以上の変換は必要ありません。
それ以外の場合、両方のオペランドが符号付き整数型であるか、または両方が符号なし整数型である場合、整数変換ランクが小さい型のオペランドは、ランクが大きいオペランドの型に変換されます。
それ以外の場合、符号なし整数型のオペランドのランクが他のオペランドの型のランク以上である場合、符号付き整数型のオペランドは符号なし整数型のオペランドの型に変換されます。
それ以外の場合、符号付き整数型のオペランドの型が符号なし整数型のオペランドの型のすべての値を表すことができる場合、符号なし整数型のオペランドは符号付き整数型のオペランドの型に変換されます。
それ以外の場合、両方のオペランドは、符号付き整数型のオペランドの型に対応する符号なし整数型に変換されます。
または、その規則は算術式の直接の lhs と rhs のみに適用され、2 つの uint16 の加算が最初に計算され、結果がわかるまで型が昇格されず、次に uint32 に昇格され、この結果uint64などに昇格...
すなわち
1.)uint64 = uint16 + uint16 + uint32 + uint64
2.)uint64 = (((uint16 + uint16) + uint32) + uint64)
3.)uint64 = ((uint32 + uint32) + uint64)
4.)uint64 = (uint64 + uint64)
これを解決する可能性のあるC標準ルールも教えてください。