0

my_mod.cpp:

#include <iostream>
using namespace std;

unsigned int my_mod(int a, unsigned int b)
{
    int result;

    cout << "\ta\t=\t" << a << endl;
    cout << "\tb\t=\t" << b << endl;
    cout << "\ta%b\t=\t" << a%b << endl;

    result = a%b;
    if (result < 0) {result += b;}
    return result;
}

int main()
{
    cout << "-1%5 = " << -1%5 << endl;
    cout << "my_mod(-1,5) = " << my_mod(-1,5) << endl;
    return 0;
}

通过:g++ ./my_mod.cpp 编译

结果是:

-1%5 = -1
    a   =   -1
    b   =   5
    a%b =   0
my_mod(-1,5) = 0

这里到底发生了什么,我只是不明白可能会发生什么?!这不可能是由于全球范围,对吧?!我的意思是它是完全相同的 %-expression ......他们怎么能产生 0 和 -1?!(顺便说一下,而不是所需的 4。)

如果有人可以,请向我解释一下……我只花了几天时间就将更广泛的错误范围缩小到这个范围。说真的,我快哭了。

在上面的示例中,如何让我的(全局)自己的模数返回 4?

4

1 回答 1

3

这是因为您使用的是无符号整数,有符号整数 (-1) 被提升为 -1 % UINT_MAX 所以您的操作变为 (-1 % UINT_MAX) % 5 = 0 (感谢 jrok 提供了更详细的原因)

尝试

cout << "\ta%b\t=\t" << a%(int)b << endl;

result = a%(int)b;

函数签名为:int my_mod(int a, unsigned int b)

或者只使用以下函数签名: int my_mod(int a, int b)

于 2013-08-30T11:40:30.083 回答