4

C で実際の数学的剰余を実行する必要があります。剰余計算で負の中間結果が生成される可能性があるため、モジュール化された引数に負の数を許可することは理にかなっています。これは最小剰余系に戻す必要があります。しかし、負のモジュールを許可するのは意味がないので、私は書きました

unsigned int mod( int x, unsigned int m )
{
    int r = x % m;
    return r >= 0 ? r : r + m;
}

ただし、負の数と正のモジュールでそのような関数を呼び出す

printf("%u\n", mod(-3, 11));

出力を生成する

1

そして、私はその理由を理解していません。説明していただけますか?

編集: 演算子 % は数学的モジュロとは異なることを知っており、正数と負数に対してそれがどのように定義されているかを知っています。私は、異なるサインではなく、異なるサインネスに対してそれが何をするかを尋ねていました。

4

3 に答える 3

6

clang有効にすると-Wconversion、間違いが明確に特定されます。

prog.cc:3:15: warning: implicit conversion changes signedness: 'unsigned int' to 'int' [-Wsign-conversion]
    int r = x % m;
        ~   ~~^~~
prog.cc:3:13: warning: implicit conversion changes signedness: 'int' to 'unsigned int' [-Wsign-conversion]
    int r = x % m;
            ^ ~
prog.cc:4:21: warning: operand of ? changes signedness: 'int' to 'unsigned int' [-Wsign-conversion]
    return r >= 0 ? r : r + m;
    ~~~~~~          ^
prog.cc:4:25: warning: implicit conversion changes signedness: 'int' to 'unsigned int' [-Wsign-conversion]
    return r >= 0 ? r : r + m;
                        ^ ~
prog.cc:9:12: warning: implicit conversion changes signedness: 'unsigned int' to 'int' [-Wsign-conversion]
    return mod(-3, 11);
    ~~~~~~ ^~~~~~~~~~~

ワンドボックスのライブサンプル


に変換するとunsigned int、 に-3なり4294967293ます。

4294967293 % 11に等しい1です。

于 2017-04-08T11:49:53.210 に答える