web-dev-qa-db-ja.com

unsignedintとsignedintが存在するC式では、どのタイプがどのタイプにプロモートされますか?

C言語標準でのデータ型の昇格規則に関するクエリがあります。 C99によると:

C整数プロモーションでは、「intが元の型のすべての値を表すことができる場合、値はintに変換されます。それ以外の場合は、unsigned intに変換されます。」

私の質問は、unsigned intsigned intが存在するC言語式の場合ですが、どのタイプがどのタイプにプロモートされますか?

例えば。 intunsigned intのすべての値(MAX_INT値より大きい値)を表すことができないのに対し、unsigned intは-ve値を表すことができないため、どの型がそのような場合?

25
goldenmean

私は以下があなたの質問に答えると思います:

6.3.1.3符号付きおよび符号なし整数

1整数型の値を_Bool以外の整数型に変換する場合、新しい型で表現できる場合は変更されません。

2それ以外の場合、新しいタイプが符号なしの場合、値が新しいタイプの範囲内になるまで、新しいタイプで表すことができる最大値より1つ多い値を繰り返し加算または減算することにより、値が変換されます。タイプ。

そうでない場合、新しいタイプは署名され、値をそのタイプで表すことができません。結果が実装定義であるか、実装定義のシグナルが発生します。

24
dirkgently

2つ混乱していると思います。 Promotionは、int/unsigned intである「より小さい」整数型の値がintまたはunsigned intに変換されるプロセスです。ルールはやや奇妙に表現されていますが(主にcharを適切に処理するため)、値と符号が保存されていることを確認してください。

次に、通常の算術変換という異なる概念があります。これにより、算術演算子のオペランドが共通の型に変換されます。オペランドがintよりも小さい型の場合は、オペランドを(intまたはunsignedに)昇格させ、次のプロセス(整数型の場合は6.3.1.8/1)でターゲットの型を選択します。

両方のオペランドのタイプが同じである場合、それ以上の変換は必要ありません。

それ以外の場合、両方のオペランドが符号付き整数型または両方が符号なし整数型を持つ場合、整数変換ランクの小さいタイプのオペランドは、ランクの大きいオペランドのタイプに変換されます。

それ以外の場合、符号なし整数型のオペランドのランクが他のオペランドの型のランク以上の場合、符号付き整数型のオペランドは符号なし整数型のオペランドの型に変換されます。

それ以外の場合、符号付き整数型のオペランドの型が符号なし整数型のオペランドの型のすべての値を表すことができる場合、符号なし整数型のオペランドは符号付き整数型のオペランドの型に変換されます。

それ以外の場合、両方のオペランドは、符号付き整数型のオペランドの型に対応する符号なし整数型に変換されます。

(それらのルールがC89とC99の間でわずかに変更されていることに注意してください)

44
AProgrammer