c/c++语言开发共享带负数的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); } 

产出

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

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

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

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

      以上就是c/c++开发分享带负数的Mod在Java和C中给出否定结果相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560747.html

      (0)
      上一篇 2021年1月28日
      下一篇 2021年1月28日

      精彩推荐