演算子が異なるタイプの2つのオペランドで使用される場合は常に、結果のタイプが2つのオペランド間の「支配的な」タイプになることを私は知っています。
たとえば、の結果は
(int) + (float)
floatになります。
別の例は次のようになります:
(char) + (double)
そして結果はdoubleです。
これは、符号付き変数と符号付き変数のみに当てはまります。
しかし、符号付き変数と符号なし変数を含めるとどうなりますか?
詳細はC11、6.3.1.8にあります。要約する:
unsignedタイプが同等以上の場合、signedタイプはunsignedに変換されます。
それ以外の場合、符号付き型が符号なし型のすべての値を保持できる場合、符号なし型は符号付き型に変換されます。
それ以外の場合は、両方が符号付きタイプに対応する符号なしバージョンに変換されます。
「広い」とは、「コンバージョンランクが高い」という意味です。
例(sizeof(short) == 2
およびなどの特定のアーキテクチャsizeof(long) == sizeof(unsigned int) = 4
):
int + unsigned int => unsigned int (first rule, equal rank)
long + unsigned short => long (second rule, long contains u. short)
long + unsigned int => unsigned long (third rule)