2

計算したい: (-15 % 3) これは 0 であるはずですが、代わりに 1 を取得しています:

私が明示的に行うとき:

int IntFcn (const void *key, size_t tableSize)
{
    printf("%d\n",(*(int*)key)); // prints -15
    printf("%d\n",tableSize); // prints 3
    printf("%d\n",(-15) % 3); // prints 0
}

正しい結果 (0) が得られますが、以下の変数を使用しようとすると 1 が得られます。

int IntFcn (const void *key, size_t tableSize)
{
    printf("%d\n",(*(int*)key)); // prints -15
    printf("%d\n",tableSize); // prints 3
    printf("%d\n",((*(int*)key) % tableSize)); // prints 1
    return ((*(int*)key) % tableSize);
}

なぜこうなった?

4

2 に答える 2

7

2番目のケースでは、モジュロの2番目のオペランドは符号なし整数であるため、モジュロを実行する前に最初のオペランドも符号なしに昇格されます。したがって、結果は(unsigned)(-15) % 3(32 ビットの場合int)と等しいものになり4294967281 % 3 == 1ます。

于 2012-12-26T11:30:11.017 に答える
1

これを試して..

return ((*(int*)key) % (int)tableSize);

于 2012-12-26T11:44:14.423 に答える