9

符号付きと符号なしの値を比較する必要があるところまで来ました。今までは、この状況を完全に回避するためにコード ベースを修正していましたが、今はそれができません。

それでは、署名されたものと署名されていないものを比較するための本当に適切な方法は何ですか? これは混合 C/C++ コード ベースであるため、私の質問は両方の言語に適用されます。

要求された値 (署名なし) に対してリソース (署名済み) をチェックしています。

if (requested > resource.max) return Never;
if (requested > resource.free - resource.assigned) return NotNow;
return Now;

私は次のようなことを考えていました (該当する場合は C++ バリアントに置き換えてください):

if (requested > (unsigned)INT_MAX) bail_out(); // assert,abort,throw,return....
if ((signed)requested > resource.max) return Never;
if ((signed)requested > resource.free - resource.assigned) return NotNow;
return Now;

私はこれに正しく取り組んでいますか、それとももっと良い方法がありますか?

4

1 に答える 1

10

このワンライナーコードを、安全に実行するための開始点として使用できます。

bool GreaterSignedUnsigned( unsigned int u, signed int i )
{
   // calculate the result of (u > i)

   // if i is nonnegative it is safe to compare 2 unsigned values, 
   // otherwise unsigned int is always greater
   return  ( i < 0 ) || ( u > static_cast<unsigned int>(i) );
}

PS追加の比較とキャストはパフォーマンスの低下を引き起こす可能性があるため、可能な限り、符号付きと符号なしの混合比較を避けることをお勧めします。

于 2012-07-31T08:27:16.667 に答える