计算函数中的模数给出了直接使用%运算符的不同答案

时间:2013-08-30 11:37:39

标签: c++ c++11

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?

1 个答案:

答案 0 :(得分:3)

这是因为你正在使用unsigned int,signed int(-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)