8

多くの場合、私が使用するオブジェクトには(署名された)intパラメーター(たとえばint iSize)があり、最終的には何かの大きさを格納します。同時に、-1オブジェクト(など)がセットアップされていない/埋められていない/使用する準備ができていないことを示すために、それらを初期化することがよくあります。

comparison between signed and unsigned integerのようなことをすると、警告が表示されることがよくありif( iSize >= someVector.size() ) { ... }ます。

したがって、私は名目上、を使用したくunsigned intありません。これがエラーまたは予期しない動作につながる状況はありますか?

そうでない場合:これを処理するための最良の方法は何ですか?コンパイラフラグを使用すると、 (またはそのようなもの)を使用する必要-Wno-sign-compareがある状況を(仮想的に)見逃す可能性があります。したがって、 -egと比較する場合は、キャストを使用する必要がありますか?unsigned intunsigned intif( iSize >= (int)someVector.size() ) { ... }

4

1 に答える 1

5

はい、あります、そして非常に微妙なものがあります。興味があれば、Stephan T. Lavavejによるこの興味深いプレゼンテーションで、算術変換と、署名付きと署名なしの比較によって引き起こされたMicrosoftのSTL実装のバグについて確認できます。

一般に、問題は、補数2の算術演算のために、非常に小さい負の積分値が非常に大きい符号なし積分値(eg -1 = 0xFFFF = 65535)と同じビット表現を持つという事実に起因します。

チェックの特定のケースでは、そもそもsize()type size_tforを使用しないのはなぜiSizeですか?符号なしの値は、表現度を高めるだけです。それを使用してください。

iSizeまた、として宣言したくない場合はsize_t、明示的なキャストを使用して、この比較の性質を認識していることを明確にしてください。コンパイラーはこれらの警告に賛成しようとしています。あなたが正しく書いたように、それらを無視すると非常にひどい頭痛を引き起こす可能性があります。

したがって、が負の場合がある場合(およびのすべての値iSizeよりも小さいと評価する必要がある場合)、イディオムを使用します。unsigned intsize()if ((iSize < 0) || ((unsigned)iSize < somevector.size())) ...

于 2013-01-27T22:36:07.383 に答える