假设我有(-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/b
和a%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
而不考虑符号(使得答案的大小小于除数的大小),如果答案是否定的,则将除数加到其上。
以上就是c/c++开发分享带负数的Mod在Java和C中给出否定结果相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560747.html