Java的%运算符是否会溢出?

Pac*_*ier 3 java portability operators modulo strictfp

在C和C++中,INT_MIN % -1根据Shafik的帖子,行为 似乎是未定义/平台依赖.

在Java中,%运算符是否会溢出?

考虑一下这段代码:

public class Test {
    public static void main(String[] args) {
        // setup variables:
        byte b = Byte.MIN_VALUE % (-1);
        short s = Short.MIN_VALUE % (-1);
        int i = Integer.MIN_VALUE % (-1);
        long l = Long.MIN_VALUE % (-1);

        // my machine prints "0" for all:
        System.out.println(b);
        System.out.println(s);
        System.out.println(i);
        System.out.println(l);
    }
}
Run Code Online (Sandbox Code Playgroud)

上述结果是否存在独立于平台的保证0

Mar*_*ank 6

看看JLS第15.17.3节,它说:

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

二进制数字提升(第5.6.2节)后整数操作数的余数运算产生一个结果值,使得(a/b)*b +(a%b)等于a.即使在特殊情况下,这种同一性仍然存在,即被除数是其类型的最大可能量值的负整数,且除数为-1(余数为0).根据这个规则可以得出,只有当被除数为负时,余数运算的结果才是负数,只有当被除数为正时才能为正;