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?
答案 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)