为什么这样的操作:
std::cout << (-7 % 3) << std::endl;
std::cout << (7 % -3) << std::endl;
Run Code Online (Sandbox Code Playgroud)
给出不同的结果?
-1
1
Run Code Online (Sandbox Code Playgroud) 因此,模数运算可以为您提供三个值:
然后:
-7%5 = 3(数学,余数> = 0)
-7%5 = -2(C++)
-7%(size_t)5 = 4(C++)
另一个例子:
-7%4 = 1(数学,余数> = 0)
-7%4 = -3(C++)
-7%(size_t)4 = 1(C++)
当左手操作数为正时,所有三种方法之间的答案是相同的.但对于负面价值观,他们似乎都有自己的方法.如何在C++中计算无符号操作数上的模运算值?
我需要在C中执行一个真正的数学模.我有理由允许模数参数的负数,因为我的模块计算会产生负中间结果,必须将其放回到最少残留系统中.但是,我写道,允许负面模块是没有意义的
unsigned int mod( int x, unsigned int m )
{
int r = x % m;
return r >= 0 ? r : r + m;
}
Run Code Online (Sandbox Code Playgroud)
然而,使用负数和正模块调用此类函数
printf("%u\n", mod(-3, 11));
Run Code Online (Sandbox Code Playgroud)
产生输出
1
Run Code Online (Sandbox Code Playgroud)
我不明白为什么.你能解释一下吗?
编辑:我知道运算符%与数学模数不同,我知道如何定义正数和负数.我问的是它会为不同的签名做些什么,而不是不同的标志.
有c ++代码:
string s = "abc";
size_t len = s.length();
cout<<(-1%len)<<endl;//print 0
Run Code Online (Sandbox Code Playgroud)
但如果将size_t更改为int:
string s = "abc";
int len = s.length();
cout<<(-1%len)<<endl;//print -1
Run Code Online (Sandbox Code Playgroud)
为什么会这样,有人可以解释一下,谢谢!