使用底片时,Modulo返回错误的结果

时间:2012-12-26 11:17:37

标签: c modulo

我想计算: (-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);
}

为什么会这样?

2 个答案:

答案 0 :(得分:7)

在第二种情况下,modulo的第二个操作数是无符号整数,因此在执行模数之前,第一个操作数也会被提升为无符号。因此结果将(unsigned)(-15) % 3相等(对于32位int)到4294967281 % 3 == 1

答案 1 :(得分:1)

试试这个..

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