MSVC の符号付き値と符号なし値の比較: 警告の不在を理解する
このコード スニペットでは、次の警告が存在しないことがわかります。具体的な比較:
int a = INT_MAX; unsigned int b = UINT_MAX; bool c = false; ... if (a == b) // no warning
これはなぜなのかという疑問を引き起こします== を使用して比較した場合、符号付き値と符号なし値の比較では警告が表示されませんが、他の比較 (<、>、<=、>=) では警告が表示されます。
バックグラウンド プロモーションと C4018
この比較では、バックグラウンド プロモーションのために警告が生成されることが予想されました。ただし、最後の 2 つの例はこのロジックに反論しています。
if (((unsigned int)a) == b) // no warning if (a == ((int)b)) // no warning
変換ルール
符号付き値と符号なし値を比較する場合、コンパイラは C 言語で概説されている特定の変換ルールに従います。標準。等価比較 (==) の場合、結果は常にブール値 (true または false) であるため、オペランドが符号付きであるか符号なしであるかは関係ありません。
ただし、他の比較では、符号付きの値が変換されます。無署名に。この変換は比較結果に影響を与えるため、重要です。たとえば、次のステートメントでは:
-1 > 2U
-1 が大きな正の符号なし整数に変換され、正しい比較が行われるため、結果は true になります。
MSVC 警告レベル
符号付き/符号なしの等価比較に対する警告を抑制するという MSVC の選択は、意図的なものです。開発者によると、== を使用して符号付き値と符号なし値を比較すると、直感的な結果が得られることがよくあります。たとえば、-1 == -1 は、符号付きか符号なしかに関係なく true となります。
一方、符号付き/符号なしに関する大なり (>) または小なり (
以上がMSVC は、符号付き/符号なしの等価比較 (==) については警告しないのに、他の比較については警告するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。