带有负数的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