符号付き/符号なしの不一致は必ずしも悪いですか?
これが私のプログラムです:
int main(int argc, char *argv[]) {
unsigned int i;
for (i = 1; i < argc; i++) { // signed/unsigned mismatch here
}
}
argc
署名されてi
いる、されていません。これは問題ですか?
「符号付き/符号なしの不一致」は悪い場合があります。あなたの質問では、あなたは比較について尋ねています。同じ基本型の2つの値を比較する場合、1つは符号付き、もう1つは符号なしの場合、符号付きの値は符号なしに変換されます。それで、
int i = -1;
unsigned int j = 10;
if (i < j)
printf("1\n");
else
printf("2\n");
1ではなく2を出力します。これは、i < j
でi
がに変換されるためunsigned int
です。 (unsigned int)-1
に等しいUINT_MAX
、非常に大きな数。したがって、条件はfalseと評価され、else
句に到達します。
あなたの特定の例でargc
は、は負ではないことが保証されているので、「不一致」について心配する必要はありません。
特定のケースでは実際の問題ではありませんが、コンパイラは、argcが常に問題を引き起こさない値を持っていることを知ることができません。
それは間接的な問題でしかありません。
&
、|
、などのビット演算に符号付き整数を使用すると、問題が発生する可能性が<<
あり>>
ます。
演算に符号なし整数を使用すると、まったく異なる問題が発生する可能性があります (アンダーフロー、数値が正しいかどうかをテストする際の無限ループ>= 0
など)。
このため、一部のコンパイラと静的チェック ツールは、いずれかのタイプの演算 (算術演算またはビット操作) で符号付き整数と符号なし整数を混在させると、警告を発行します。
例のような単純なケースではそれらを混在させても安全ですが、そうすると、それらの静的チェックツールを使用できない (またはそれらの警告を無効にする必要がある) ことになり、他のバグが検出されない可能性があります。
size_t
メモリ管理コードの型の値に対して算術演算を行う場合など、選択の余地がない場合があります。
あなたの例でint
は、型が少ない方が簡単int
で、の最初の引数の型であるため、とにかくそこにあるという理由だけで、私はに固執しmain()
ます。
悪くない。符号付き/符号なしの不一致に関するコンパイラの警告を修正したいと思います。符号付き/符号なしの不一致のためにバグを修正する必要がある場合、コンパイラは基本的に「そう言った」と言っています。理由があるという警告を無視しないでください。