2014-09-10 334 views
3

在C和C++中,根据Shafik's postINT_MIN % -1的行为似乎是未定义/平台相关的。Java的%运算符是否溢出?

在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); 
    } 
} 

是否有一个独立于平台的保证,上述结果是0

+0

Java本质上是平台独立的,所以我猜(没选中)答案是YES – shlomi33 2014-09-10 12:28:38

回答

6

JLS section 15.17.3它说:

在C和C++,其余的运营商只接受整型操作数, 但在Java编程语言,它也接受浮点操作数 。

对于那些经过二进制 数值提升整数的操作数的余数运算(§5.6.2)产生的结果值,使得 (A/B)* B +(A%B)是等于一。即使在特殊的 的情况下,该特征也成立,即被除数是其类型的最大可能的 幅度的负整数,并且除数是-1(余数为0)。其 遵循这一规则,其余操作的结果 只有在股息为负数时才为负数,并且如果股息为正数只能为正数 ;

+1

我正要发布这个^^几乎所有东西都在JLS中,特别是对于这类问题。 – Joffrey 2014-09-10 12:31:21

+0

对不起@Joffrey当我读到这个问题时,我的屏幕上有这个话题: - $ – 2014-09-10 12:40:09

+0

哈哈这没问题,这里的重点是要回答这个问题,不管是谁写的; – Joffrey 2014-09-10 12:41:14