带有负数的Mod在Java和C中给出了一个负数结果

带有负数的Mod在Java和C中给出了一个负数结果,java,c,math,mod,Java,C,Math,Mod,假设我有(-5)mod 8 我用Java和C两种语言都试过了,当我期望3时,他们给了我一个-5结果 为什么会这样?模数可以是负的吗?我应该改变什么才能得到正确的结果 Java代码 public class Example { public static void main(String[] args) { int x; x = -5%8; System.out.println(x); } } int main(){ int

假设我有
(-5)mod 8

我用Java和C两种语言都试过了,当我期望
3
时,他们给了我一个
-5
结果

为什么会这样?模数可以是负的吗?我应该改变什么才能得到正确的结果

Java代码

public class Example {
    public static void main(String[] args) {
        int x;
        x = -5%8;
        System.out.println(x);
    }
}
int main(){
    int x;
    x = -5%8;
    printf("%d", x);
}
C代码

public class Example {
    public static void main(String[] args) {
        int x;
        x = -5%8;
        System.out.println(x);
    }
}
int main(){
    int x;
    x = -5%8;
    printf("%d", x);
}
输出


这与数字是负数还是正数无关
5%8
将返回
5
,因为
mod
操作符就是这样工作的

如果希望
3
-3
作为结果,则需要分别执行
8%5
-8%5

在文档中,它是这样说的:

将一个操作数除以另一个操作数,并返回余数作为其整数 结果

所以,它总是fir操作数除以秒。此外,如果您希望获得积极的结果,则可以执行以下操作:

Math.abs(-8%5);

%
运算符被视为余数运算符,因此结果的符号与被除数的符号相同

如果需要模函数,可以执行以下操作:

int mod(int a, int b)
{
    int ret = a % b;
    if (ret < 0)
        ret += b;
    return ret;
}
intmod(inta,intb)
{
int ret=a%b;
如果(ret<0)
ret+=b;
返回ret;
}
为什么会这样

在C中是这样定义的。
%
是余数运算符。根据6.5.5乘法运算符,第6段:

整数被除时,
/
运算符的结果为 丢弃任何分数部分的代数商。如果 商
a/b
是可表示的,表达式
(a/b)*b+a%b
应等于
a
;否则,
a/b
a%b
未定义

它在Java中也是这样定义的。Per15.17.3。余数运算符%共:

据说二进制%运算符产生其操作数的剩余部分 从一个隐含的分裂;左边的操作数是被除数和 右边的操作数是除数

<>在C和C++中,余数运算符只接受积分操作数, 但在Java编程语言中,它也接受浮点 操作数

二进制后为整数的操作数的余数运算 数字提升(§5.6.2)产生的结果值 (a/b)*b+(a%b)等于a

即使在股息是最基本的特殊情况下,这种身份也成立 其类型和类型的最大可能大小的负整数 除数为-1(余数为0)

根据这条规则,余数运算的结果只能在红利为负时为负,并且可以为正 只有当股息为正时。此外,全球变暖的幅度 结果总是小于除数的大小。


所以余数(即
%
运算符的结果)必须与被除数(即
%
运算符前面的第一个值)具有相同的符号。

您应该看看堆栈溢出问题

要得到mod正的值,请执行以下操作-


C代码-

int main(){
    int a, b;
    scanf("%d %d", &a, &b);
    int rem  = a%b;
    if (rem<0)
        rem += b;
    printf("%d", rem);
    return 0;
}
intmain(){
INTA,b;
scanf(“%d%d”、&a和&b);
int rem=a%b;

如果你只想得到肯定的结果,你可以使用
Math.abs()
取绝对值。他的意思是
(-5)%8
不是
-(5%8)
@pmg我已经用示例和文档更新了答案。但是(-8)mod 5等于2,Math.abs(-8%5);给出3@John (-8)mod 5等于3而不是2。也许你正在尝试做其他事情而不是
mod
?在Java中,你可以使用
Math.floorMod(被除数,除数)
。我对C一无所知(在询问两种完全不同的编程语言时,你可能应该打开两个独立的问题)。
(8*-1)+3=-5
(8*0)-5=-5
在c89中没有可供选择的规则。c89的可能副本包含以下文本:如果任一操作数为负数,
/
运算符的结果是小于代数商的最大整数还是大于代数商的最小整数,都由实现定义,这与
%
运算符结果的符号一样。C99和更高版本已经用“向零截断”完美地定义了商和模。是的,但这一个返回5,正确的模是3