3

私は困惑しています。例:

int x=-1; 
unsigned y=0;
(x<y) ----> false

int8_t x=-1;
unint8_t y=0;
(x<y) ----> true

さらに、コンパイラは最初の比較で警告を出しますが、2 番目の比較では出ません。どうやら

  • (int vs unsigned) - int を unsigned に昇格
  • (intN_t vs uintN_t) - uintN_t が intN_t に昇格

なぜこのような振る舞いをするのですか?のように... 本当に?

4

2 に答える 2

3

2 項算術演算子 (比較を含む) を より短い数値型のペアに適用すると、C は演算を実行する前にint両方のオペランドを に変換します。int

サイズが同じで符号が一致せず、より短くない数値型のペアにバイナリ算術演算子を適用するとint、C は演算の前に符号付きオペランドを符号なしに変換します。

これらは、「整数昇格」ルールの 2 つです。それらはそれほど直観的ではなく、おそらく今日 C をゼロから設計していた場合に行うことではないでしょう。

于 2013-05-02T16:57:01.537 に答える
2

これは、通常の整数変換の結果です。

最初のケースでは、両方のオペランドのランクが少なくとも でありint、同じランクであるため、符号なし整数型に変換されます。

2 番目のケースでは、int8_tis char(存在する場合は存在する必要があります) であるため、両方のオペランドが に昇格されintます。-1とはどちらもで0表現intできるため、警告はありません。

于 2013-05-02T16:56:48.490 に答える