次のコード スニペットを考えてみましょう:
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 標準で定義されている「変換」ルール。これらのルールは、比較の前にどのプロモーションが発生するかを決定します。
なぜ a == b に警告が出ないのですか?
この例では、== を使用して a と b を比較するときに、MSVC は警告を発行しません比較の前に両方のオペランドが unsigned int に変換されるためです。 a と b の値は両方とも正であるため、符号付き/符号なしの不一致はなく、結果は正しいです。
直感的な結果と非直感的な結果
一方a == b に対する警告がないことは直感的に思えるかもしれませんが、a < のような比較については同じことが言えません。 b.この場合、 a を unsigned に変換すると値が大きくなり、比較の結果に影響します。したがって、MSVC は、符号付き/符号なしの比較に関する潜在的な問題を強調する警告を発行します。
結論
MSVC は、通常の算術演算であるため、a == b に対して警告を発行しません。変換の結果、両方のオペランドが同じ符号なし型に変換され、符号付き/符号なしの不一致が排除されます。ただし、< のような演算子を使用した比較の場合は、または > の場合、変換によって予期しない結果が生じる可能性があるため、コンパイラーから警告が出されます。
以上がMSVC は、符号付き/符号なしの比較について警告する場合と警告しない場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。