我们说我有(-5) mod 8
。
我用Java和C两种语言尝试过它,当我期待-5
时,他们给了我一个3
的结果。
为什么会这样?模数可以为负数吗?我应该改变什么来获得正确的结果?
Java代码
public class Example {
public static void main(String[] args) {
int x;
x = -5%8;
System.out.println(x);
}
}
C代码
int main(){
int x;
x = -5%8;
printf("%d", x);
}
OUTPUTS
答案 0 :(得分:2)
为什么会这样?
在C中定义了这种方式。%
是余数运算符。每 6.5.5乘法运算符,the C Standard的第6段:
当整数被分割时,
/
运算符的结果是 任何小数部分丢弃的代数商。如果 商a/b
可表示,表达式(a/b)*b + a%b
应等于a
;否则,a/b
和{。}的行为a%b
未定义。
它也是用Java定义的。每 15.17.3。 the Java 8 specification的剩余运算符%:
二进制%运算符据说可以产生其余的操作数 来自隐含的分歧;左手操作数是红利和 右手操作数是除数。
在C和C ++中,余数运算符只接受整数操作数, 但在Java编程语言中,它也接受浮点数 操作数。
二进制后整数操作数的余数运算 数字促销(第5.5.2节)产生一个结果值 (a / b)* b +(a%b)等于a。
即使在股息为的特殊情况下,这种身份仍然存在 其类型和最大可能大小的负整数 除数为-1(余数为0)。
从这个规则可以得出,只有当被除数为负时,余数运算的结果才可以是负数,并且可以是正数 只有股息是积极的。而且,的幅度 结果总是小于除数的大小。
因此,余数 - %
运算符的结果 - 必须与被除数相同的符号 - 第一个值,在%
运算符之前。
答案 1 :(得分:0)
不是这个数字是消极的还是积极的。 5%8
会返回5
,因为mod
运营商的工作原理。
如果您希望3
或-3
为结果,则需要分别8%5
或-8%5
。
Here's文档,这就是它所说的:
将一个操作数除以另一个操作数,并将余数作为其返回 结果
所以,它始终是冷杉操作数除以秒。此外,如果您想要积极的结果,那么您可以这样做:
Math.abs(-8%5);
答案 2 :(得分:0)
%
运算符被视为余数运算符,因此结果的符号与被除数的符号相同。
如果你想要一个模数函数,你可以这样做:
int mod(int a, int b)
{
int ret = a % b;
if (ret < 0)
ret += b;
return ret;
}
答案 3 :(得分:0)
您应该查看Stack Overflow问题 What's the difference between “mod” and “remainder”? 。
要获得mod肯定 -
C Code -
int main(){
int a, b;
scanf("%d %d", &a, &b);
int rem = a%b;
if (rem<0)
rem += b;
printf("%d", rem);
return 0;
}
类似的是Java代码。
基本上,方法是首先取mod
而不考虑符号(使得答案的大小小于除数的大小),如果答案为负,则将除数加到其上。