5

符号付き/符号なしの不一致は必ずしも悪いですか?

これが私のプログラムです:

int main(int argc, char *argv[]) {
    unsigned int i;

    for (i = 1; i < argc; i++) { // signed/unsigned mismatch here

    }
}

argc署名されてiいる、されていません。これは問題ですか?

4

4 に答える 4

9

「符号付き/符号なしの不一致」は悪い場合があります。あなたの質問では、あなたは比較について尋ねています。同じ基本型の2つの値を比較する場合、1つは符号付き、もう1つは符号なしの場合、符号付きの値は符号なしに変換されます。それで、

int i = -1;
unsigned int j = 10;

if (i < j)
    printf("1\n");
else
    printf("2\n");

1ではなく2を出力します。これは、i < jiがに変換されるためunsigned intです。 (unsigned int)-1に等しいUINT_MAX、非常に大きな数。したがって、条件はfalseと評価され、else句に到達します。

あなたの特定の例でargcは、は負ではないことが保証されているので、「不一致」について心配する必要はありません。

于 2010-02-14T21:01:53.067 に答える
1

特定のケースでは実際の問題ではありませんが、コンパイラは、argcが常に問題を引き起こさない値を持っていることを知ることができません。

于 2010-02-14T21:02:06.133 に答える
1

それは間接的な問題でしかありません。

&|、などのビット演算に符号付き整数を使用すると、問題が発生する可能性が<<あり>>ます。
演算に符号なし整数を使用すると、まったく異なる問題が発生する可能性があります (アンダーフロー、数値が正しいかどうかをテストする際の無限ループ>= 0など)。

このため、一部のコンパイラと静的チェック ツールは、いずれかのタイプの演算 (算術演算またはビット操作) で符号付き整数と符号なし整数を混在させると、警告を発行します。

例のような単純なケースではそれらを混在させても安全ですが、そうすると、それらの静的チェックツールを使用できない (またはそれらの警告を無効にする必要がある) ことになり、他のバグが検出されない可能性があります。

size_tメモリ管理コードの型の値に対して算術演算を行う場合など、選択の余地がない場合があります。

あなたの例でintは、型が少ない方が簡単intで、の最初の引数の型であるため、とにかくそこにあるという理由だけで、私はに固執しmain()ます。

于 2010-02-14T21:10:09.970 に答える
1

悪くない。符号付き/符号なしの不一致に関するコンパイラの警告を修正したいと思います。符号付き/符号なしの不一致のためにバグを修正する必要がある場合、コンパイラは基本的に「そう言った」と言っています。理由があるという警告を無視しないでください。

于 2010-02-14T21:45:12.340 に答える