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

假设我有(-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); } } 

C代码

 int main(){ int x; x = -5%8; printf("%d", x); } 

产出

在此输入图像描述

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

如果你想要一个模数函数,你可以这样做:

 int mod(int a, int b) { int ret = a % b; if (ret < 0) ret += b; return ret; } 

为什么会这样?

它在C.中定义为% 。余数运算符。 每6.5.5乘法运算符 , C标准第6段:

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

它也是用Java定义的。 按15.17.3。 Java 8规范的 剩余运算符%

据说二进制%运算符从隐含的除法中产生其余的操作数; 左手操作数是被除数,右手操作数是除数。

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

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

即使在特殊情况下,这种同一性仍然存在,即被除数是其类型的最大可能量值的负整数,且除数为-1(余数为0)。

从该规则可以得出,只有当被除数为负时,余数运算的结果才可以是负数,并且只有在被除数为正数时才能为正。 而且,结果的大小总是小于除数的大小。

因此,余数 – %运算符的结果 – 必须与被除数相同的符号 – 第一个值,在%运算符之前。

这不是数字是消极的还是积极的。 5%8将返回5因为这是mod运算符的工作方式。

如果你想要3-3作为结果,你需要分别做8%5-8%5

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

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

所以,它始终是冷杉操作数除以秒。 此外,如果您想要积极的结果,那么您可以这样做:

 Math.abs(-8%5); 

你应该看看Stack Overflow问题“mod”和“remaining”之间有什么区别?

为了获得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; } 

类似的是Java代码。

基本上,方法是首先采用mod而不考虑符号(使得答案的大小小于除数的大小),如果答案是否定的,则将除数加到其上。