2016-11-29 8 views
2

私は基本的に特定の数からカウントダウンする必要があり、その数を配列のインデックスとして使用するという非常に些細なコードを持っています。負の数値より大きい数値

auto bigSize = BigArray.size() - 1; 

while(bigSize > -1) { 
    auto thing = arr[bigSize ]; 
    bigSize--; 
} 

しかし、コードは決してループ内の何かをヒットしないようです。私は私が間違って何をやっているように感じるが、私はそれを見つけることができないよう

auto bigSize = BigArray.size() - 1; 

for(int i = bigSize ; i >= 0 && i < bigSize ; --i) { 
    auto thing = arr[i]; 
} 

:私はまたforループで試してみました。

+1

'BigArray.size()'は 'unsigned'を返しますか?それから、 'bigSize'も' unsigned'となり、ゼロになることはありません(あなたがそれをどれだけ減らしても) – user463035818

+0

あなたの質問を[編集]して[mcve]を提供してください。 –

+1

'while'ループでは' bigSize'を変更することはありませんが、どのようにfalseになるのでしょうか? –

答えて

2
while(bigSize > -1) { 
    auto thing = arr[bigSize ]; 
    bigSize--; 
} 

これは決して止まらないでしょう。 bigSizeunsignedです。つまり、負の値を含むことはできません。 bigSizeの瞬間が0で、それをデクリメントしようとするとstd::numeric_limits<type>::max()になります。 (アンダーフロー、否定的ではない)だから、それはループを続けます。

bigSizeを明示的にintに変更してください。

+0

これは正しい。ループが動作する前に、サイズをintにキャストしなければなりませんでした。入力いただきありがとうございます!私はC#の背景から来たので、これは奇妙でした。 – TheGeekZn

+0

符号なし整数型はアンダーフローしません。つまり、Z mod 2^[NumBits-1]にあるNumBitsで等価クラスの代表を選択することで、与えられた数を表します。 。 –

+0

@Baummitaugen正解、正しい言葉が見つかりませんでした。自由に編集できます。 –

0

std :: コンテナ .size()は常に符号なしの数値を返します。アンダーフローしても、符号なしの数値は常に負の数より大きくなります。

関連する問題