0

重複の可能性: unsigned
とsignedの比較
unsignedintとsignedcharの比較

このwhileステートメントを入力しようとすると、奇妙な動作をします。

unsigned u = 0;
int i = -2;

while(i < u)
{
    // Do something
    i++;
}

i = -2しかし、ブレークポイントとを設定しても、決して入りませんu = 0。私は何が間違っているのですか?どうすればこれを修正できますか?

4

2 に答える 2

6

これは、ANSI C標準で、unsigned int u修飾型(your)と非修飾型(your int i)が比較されるたびに、非修飾型が同じ型(したがって常にint)にプロモートされるだけでなく、他の量の修飾子(つまり、になりますunsigned)。

intに等しい値を持つyourが最初のバイトになると、次の変換が-2行われます。あなたは今では非常に大きな正の数であり、確かにあなたのよりも大きいです。unsigned0000 0010 -> 1111 1110intunsigned int

解決策があります:キャストするsigned

while(i < (signed) u)
{
    // Do something
    i++;
}

ちなみに、おそらくあなたのコンパイラはあなたに警告を与えるべきです。

于 2012-06-01T11:52:12.063 に答える
2

符号付き整数と符号なし整数を比較していて、問題はそこから始まりました...
そうしないでください。問題なく動作するはずです。

于 2012-06-01T11:51:52.277 に答える