2016-08-30 10 views
-1

署名されたものと署名されていないものとを比較するにはどうすればよいでしょうか? (おそらく重複したが、私は正しい答えを見つけることができません)署名されたものと署名されていないものを正しく比較する方法

unsigned i = -1 
int j = -1 
... 
if ((int)i != j) j= (int) j 

または

if (int(i) != j) j=int(i) 

それが違いを生むのでしょうか?私は前者を使用していますが、いくつかの極端なケースでは、jがコード内で非物理的に大きな数を返すことがわかります。

+2

符号なしにはできません0未満です。だから、最大でi'結果 '上の-1の割り当て-unsignedの値を – Hayt

+0

としてコメントしてくれてありがとうございます - いずれにせよ、最初に 'i = 0'があったら、それを比較する正しい構文は何でしょうか? – Terma

+0

比較には違いはなく、どちらも実装定義の動作を呼び出す可能性があります。可能であれば、最初に署名付きと署名なしを混在させないでください。 (私の推薦:ビットマジックをしていない限り、符号なしのintから離れているが、多少の争点がある) –

答えて

0

一般に、値の範囲によって異なります。

符号付きの値が0よりも小さい場合は、署名されていない値を符号付きの値にキャストする必要があります。

一方、符号なしの値が最大符号以上になる場合は、符号付きを符号なし型にキャストする必要があります。

両方とも真の場合は、より大きなタイプを使用する必要があります。

また、スタイルはstatic_cast<int>(i)とよく見えます。あなたは手動タイプをキャストする前にそれらを確認するかのようなものを使用し、範囲がわからない場合は

boost::numeric_cast

関連する問題