带负数的Mod在Java和C中给出否定结果

时间:2017-05-13 12:40:12

标签: java c math mod

我们说我有(-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

Enter image description here

4 个答案:

答案 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而不考虑符号(使得答案的大小小于除数的大小),如果答案为负,则将除数加到其上。