ホームページ >バックエンド開発 >C++ >MSVC は、符号付き/符号なしの比較について警告する場合と警告しない場合があるのはなぜですか?

MSVC は、符号付き/符号なしの比較について警告する場合と警告しない場合があるのはなぜですか?

DDD
DDDオリジナル
2024-12-26 01:27:11616ブラウズ

Why Does MSVC Warn About Signed/Unsigned Comparisons in Some Cases But Not Others?

MSVC での符号付き整数と符号なし整数の比較

次のコード スニペットを考えてみましょう:

int a = INT_MAX;
unsigned int b = UINT_MAX;
bool c = false;

if (a < b)  // warning C4018: '<' : signed/unsigned mismatch
    c = true;
... // Additional comparisons

if (a == b)  // no warning
    c = true;
... // Additional comparisons

符号付き/符号なしの不一致について

C 内、符号付き整数と符号なし整数には異なる型があり、それらを直接比較する場合 (たとえば、<、> を使用する場合)、MSVC は警告 (C4018) を発行します。これは、コンパイラが比較を実行する前に両方のオペランドを共通の型に昇格させようとするためです。

昇格ルール

整数比較の場合、MSVC は「通常の算術演算」に従います。 C 標準で定義されている「変換」ルール。これらのルールは、比較の前にどのプロモーションが発生するかを決定します。

  • 整数のプロモーション (例: int から long int)
  • 符号なしオペランドの型が符号付きオペランドより大きい場合の型への変換operand
  • 両方のオペランドが次の場合、unsigned long int に変換します。 integers

なぜ a == b に警告が出ないのですか?

この例では、== を使用して a と b を比較するときに、MSVC は警告を発行しません比較の前に両方のオペランドが unsigned int に変換されるためです。 a と b の値は両方とも正であるため、符号付き/符号なしの不一致はなく、結果は正しいです。

直感的な結果と非直感的な結果

一方a == b に対する警告がないことは直感的に思えるかもしれませんが、a < のような比較については同じことが言えません。 b.この場合、 a を unsigned に変換すると値が大きくなり、比較の結果に影響します。したがって、MSVC は、符号付き/符号なしの比較に関する潜在的な問題を強調する警告を発行します。

結論

MSVC は、通常の算術演算であるため、a == b に対して警告を発行しません。変換の結果、両方のオペランドが同じ符号なし型に変換され、符号付き/符号なしの不一致が排除されます。ただし、< のような演算子を使用した比較の場合は、または > の場合、変換によって予期しない結果が生じる可能性があるため、コンパイラーから警告が出されます。

以上がMSVC は、符号付き/符号なしの比較について警告する場合と警告しない場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。