次のように、unsigned int と signed char を比較しようとしています。
int main(){
unsigned int x = 9;
signed char y = -1;
x < y ? printf("s") : printf("g");
return 0;
}
私はo/pが「g」であることを期待していました。代わりに、その「s」。ここではどのような変換が行われますか?
次のように、unsigned int と signed char を比較しようとしています。
int main(){
unsigned int x = 9;
signed char y = -1;
x < y ? printf("s") : printf("g");
return 0;
}
私はo/pが「g」であることを期待していました。代わりに、その「s」。ここではどのような変換が行われますか?
C99 のセクション6.3.1.8
「通常の算術変換」では、暗黙的な整数変換について詳しく説明しています。
両方のオペランドが同じ型の場合、それ以上の変換は必要ありません。
種類が違うので関係ありません。
それ以外の場合、両方のオペランドが符号付き整数型であるか、両方が符号なし整数型である場合、整数変換ランクの小さい型のオペランドは、ランクの大きいオペランドの型に変換されます。
一方は署名されており、もう一方は署名されていないため、これはカウントされません。
それ以外の場合、符号なし整数型のオペランドのランクが他のオペランドの型のランク以上である場合、符号付き整数型のオペランドは符号なし整数型のオペランドの型に変換されます。
ビンゴ。x
は よりランクが高いy
ので、y は に昇格しunsigned int
ます。つまり、 から-1
に変化しUINT_MAX
、実質的に 9 よりも大きくなります。
一致するものが見つかったので、残りのルールは適用されませんが、完全を期すために含めておきます。
それ以外の場合、符号付き整数型のオペランドの型が符号なし整数型のオペランドの型のすべての値を表すことができる場合、符号なし整数型のオペランドは符号付き整数型のオペランドの型に変換されます。
それ以外の場合、両方のオペランドは、符号付き整数型のオペランドの型に対応する符号なし整数型に変換されます。
この質問に関連するランクを以下に示します。すべてのランクは、C99 のセクション6.3.1.1
、ブール値、文字、および整数で詳しく説明されているので、詳細についてはそれを参照してください。
のランクは のランク
long long int
よりも大きく、 のランクよりもlong int
大きく、int
のランクよりもshort int
大きくなり、 のランクよりも大きくなりますsigned char
。のランクは
char
と のランクに等しいものsigned char
としunsigned char
ます。
私の推測では、(ラッピングにより)大きな値になるようにy
昇格されます。unsigned int
したがって、条件は満たされます。
次のコードを実行しました。
int main(){
unsigned int x = 9;
signed char y = -1;
printf("%u\n", (unsigned int)y);
x < (unsigned int)y ? printf("s") : printf("g");
return 0;
}
出力は次のとおりです。
4294967295 s
キャスト後、y は非常に大きな値になります。そのため、出力は s です。
char は、9 より大きい MAX_UINT の値を持つ unsigned int に昇格されます。