2011-09-22 12 views
8

私は、次のコードを持っている:GCCとの奇妙な警告動作および署名/符号なしの比較

unsigned int a; 
if (a > numeric_limits<int>::max()) 
    do_stuff(); 

コンパイル、gccはおよそ

警告が文句:

"との比較を符号付きと符号なし"

OK、分かりました

ただし、次のコードを使用してください:

unsigned int a; 
if (a > (numeric_limits<int>::max())) 
    do_stuff(); 

は、そのような行動のための論理的な理由があるのか​​、私が何か間違ったことをやっている...警告は表示されなくなり、私は本当に理由を知りません!

+1

[この動作をシミュレート](のhttp:// WWWを。 ideone.com/5NZL9)。しかし、警告が表示されます。 – iammilind

+0

周辺のコードは何ですか? – quasiverse

+0

do_stuff()部分は、例外をスローするだけです。これは関数内の唯一の行であるため、周囲のコードはありません。ただし、この関数は大きなプロジェクトで使用されます。 iammilindが提供するコードを試しましたが、警告は表示されません。ここに私がプログラム '-Wall -ansi -pedantic -Wno-long-long'をコンパイルするために使用するgccオプションがあります。 – malamioute

答えて

-1

回答は、gccがintunsigned intを処理する方法にあります。

unsigned intおよびintは、両方とも2バイト値を格納する。それらの違いは、unsigned intは負の値をサポートしていないことです。 0〜65,535の値しか格納できません。 GCCがintとunsigned intの比較を見ると、intを正の数に変換します。たとえば、intの値が-2の場合、2に変換されます。ただし、intには()演算子が前に付いています。 (int)。 GCCはそれを正の数として解釈しますが(それでもそれを変換します)、警告は表示されません。

+0

'int'は一般的に「2バイト値」ではなく、今日実際に使用されているC++コンパイラではありません。 –

0

を参照してください。私は現在、これをテストするためのC++コンパイラへのアクセスを持っていないが、私は、これは警告なしに働くかもしれないと思う:

しようとした
unsigned int a; 
if (a > numeric_limits<unsigned int>::max()) 
    do_stuff(); 
+0

これは間違いなく警告(ステートメントは常にfalse)を生成するはずです! – UncleBens

+0

警告なしで同じ結果を得るには 'if(a> unsigned(numeric_limits :: max()))'を実行します。 – UncleBens

+0

私は今もそれを見る。 'a 'は' 0xffffffff'より大きくすることはできません。したがって、@UncleBensが示すように 'if(a> unsigned(numeric_limits :: max()))')は正しいです。 – npclaudiu

関連する問題