4

次のように、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」。ここではどのような変換が行われますか?

4

4 に答える 4

23

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ます。

于 2011-02-23T07:22:10.257 に答える
2

私の推測では、(ラッピングにより)大きな値になるようにy昇格されます。unsigned intしたがって、条件は満たされます。

于 2011-02-23T07:16:31.680 に答える
2

次のコードを実行しました。

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 です。

于 2011-02-23T07:28:08.887 に答える
1

char は、9 より大きい MAX_UINT の値を持つ unsigned int に昇格されます。

于 2011-02-23T07:17:02.007 に答える