重複の可能性: unsigned
とsignedの比較
unsignedintとsignedcharの比較
このwhileステートメントを入力しようとすると、奇妙な動作をします。
unsigned u = 0;
int i = -2;
while(i < u)
{
// Do something
i++;
}
i = -2
しかし、ブレークポイントとを設定しても、決して入りませんu = 0
。私は何が間違っているのですか?どうすればこれを修正できますか?
重複の可能性: unsigned
とsignedの比較
unsignedintとsignedcharの比較
このwhileステートメントを入力しようとすると、奇妙な動作をします。
unsigned u = 0;
int i = -2;
while(i < u)
{
// Do something
i++;
}
i = -2
しかし、ブレークポイントとを設定しても、決して入りませんu = 0
。私は何が間違っているのですか?どうすればこれを修正できますか?
これは、ANSI C標準で、unsigned int u
修飾型(your)と非修飾型(your int i
)が比較されるたびに、非修飾型が同じ型(したがって常にint
)にプロモートされるだけでなく、他の量の修飾子(つまり、になりますunsigned
)。
int
に等しい値を持つyourが最初のバイトになると、次の変換が-2
行われます。あなたは今では非常に大きな正の数であり、確かにあなたのよりも大きいです。unsigned
0000 0010 -> 1111 1110
int
unsigned int
解決策があります:キャストするsigned
while(i < (signed) u)
{
// Do something
i++;
}
ちなみに、おそらくあなたのコンパイラはあなたに警告を与えるべきです。
符号付き整数と符号なし整数を比較していて、問題はそこから始まりました...
そうしないでください。問題なく動作するはずです。