表示されているのは、算術式、特に本質的にバイナリである (2 つの引数を取る) 間に発生する、いわゆる「通常の算術変換」の結果です。
これは§5/9で説明されています:
算術型または列挙型のオペランドを期待する多くの二項演算子は、同様の方法で変換を行い、結果の型を生成します。目的は、結果の型でもある共通の型を生成することです。このパターンは通常の算術変換と呼ばれ、次のように定義されます。
— いずれかのオペランドの型が の場合long double
、もう一方は に変換されlong double
ます。
— それ以外の場合、いずれかのオペランドがdouble
の場合、もう一方は に変換されdouble
ます。
— それ以外の場合、いずれかのオペランドがfloat
の場合、もう一方は に変換されfloat
ます。
— それ以外の場合、整数昇格 (4.5) は両方のオペランドで実行されます。54)
- 次に、どちらかのオペランドがunsigned long
もう一方の場合、 に変換されunsigned long
ます。
— 一方のオペランドが along int
で、もう一方がunsigned int
である場合、along int
が an のすべての値を表すことができる場合unsigned int
、はunsigned int
a に変換されlong int
ます。それ以外の場合は、両方のオペランドが に変換されunsigned long
int
ます。
— それ以外の場合、いずれかのオペランドがlong
の場合、もう一方は に変換されlong
ます。
— それ以外の場合、いずれかのオペランドがunsigned
の場合、もう一方は に変換されunsigned
ます。
[注: それ以外の場合、残りの唯一のケースは、両方のオペランドが であるということですint
]
§4.5 で言及されているプロモーションは次のとおりです。
1 型char
、signed char
、unsigned char
、short int
またはの右辺値は、ソース型のすべての値を表すことができる場合unsigned short int
、型の右辺値に変換できます。それ以外の場合は、ソースの右辺値を type の右辺値に変換できます。 int
int
unsigned int
2 型wchar_t
(3.9.1) または列挙型 (7.2) の右辺値は、基になる型のすべての値を表すことができる次の型の最初の右辺値に変換できます: int
、unsigned int
、long
、またはunsigned long
。
3 整数ビットフィールド (9.6) の右辺値は、ビットフィールドのすべての値を表すことができるint
場合、型の右辺値に変換できます。それ以外の場合は、ビットフィールドのすべての値を表すことができる場合int
に変換できます。ビットフィールドがさらに大きい場合、整数昇格は適用されません。ビットフィールドに列挙型がある場合、プロモーション目的でその型の他の値として扱われます。 unsigned int
unsigned int
4 型の右辺値は、型の右辺値bool
に変換できます。ゼロにint
なると になります。 false
true
one
5 これらの変換は、積分昇格と呼ばれます。
ここから、「乗法演算子」や「加法演算子」などのセクションにはすべて、「通常の算術変換が実行されます...」というフレーズがあり、式のタイプを指定します。
つまり、整数演算を行う場合、型は上記のカテゴリで決定されます。あなたの場合、プロモーションは §4.5/1 でカバーされており、式のタイプはint
です。