为什么下面的代码在Java 1.6和1.7中表现不同

普鲁-

下面的代码

public class Test16Jit {
  public static void main(String[] s) {
      int max = Integer.MAX_VALUE;
      int i = 0;
      long li = 0;
      while (i >= 0) {
          i++;
          li++;
          if (i > max) {
              System.out.println("i is : " + i);
              System.out.println("max is : " + max);
              System.out.println("Woo!! something really went wrong");
          }
      }
      System.out.println("Value of i: " + i);
      System.out.println("Total # of iterations: " + li);      
  }
}

以下在Java 1.7x中的输出

Value of i: -2147483648
Total # of iterations: 2147483648

Java 1.6x中的以下输出

i is : 2147483636
max is : 2147483647
Woo!! something really went wrong
Value of i: -2147483648
Total # of iterations: 2147483648

有这种现象的原因吗?

另外,如果我改变

int max = Integer.MAX_VALUE; -> final int max = Integer.MAX_VALUE;

在1.6倍和1.7倍时其行为完全相同

morskiborski:

似乎是由JIT编译引起的与此错误相关的一系列错误的许多示例之一(由于代码的相似性,我选择了此错误,请随时探索其他错误-它们非常有趣!):

http://bugs.java.com/view_bug.do?bug_id=6196102

评价

问题在于循环出口测试的规范化以准备循环转换。

do while (++i <= limit)

变成

do while (++i < limit+1)

当limit为maxInt时,这是不正确的。

1.7中修复了一些问题,可以解释您的结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么下面的 3 行代码返回 1?

为什么在下面的代码中,“ decimal.TryParse()”对于输入字符串“ -1”总是返回0?

为什么Java字符串比较在Java 15和Java 11中表现不同?

为什么Java字符串比较在Java 15和Java 11中表现不同?

为什么我们不能在下面的代码中为字符串 s1 提供输入?

为什么 Angular 在下面的简单代码中生成 3 而不是 1?

为什么下面的代码没有在输出中生成“1”?

为什么Java参数在Windows和Linux中表现不同?

为什么std :: atomic构造函数在C ++ 14和C ++ 17中表现不同

为什么全局声明 row 和 col 在下面的代码中不起作用

为什么下面的Integer类型变量输出-1?

为什么下面的代码表现得如此奇怪?Python3.5和Python3.6

为什么在下面的C ++程序中2147453647 * 2147453647的乘积显示为1,而-2147453648 * -2147453648的乘积显示为0?

使用的目的是什么?和:在下面的代码中

在下面的链接中,他们为什么在 javascript 步骤中的 slides[slideIndex-1].style.display = "block" 添加“-1”?

为什么 HashSet 在 Java 8 和 Java 9+ 中表现不同?

为什么Lambda表达式在Kotlin和Java类中表现不同?

为什么 Pattern.compile 在 android studio 和 Java SE 中表现不同?

§7.1.6.3/ 1(C ++ 14)不接受下面第二个代码段中的构造。为什么是这样?

下面的Java代码是给输出1 2 3。如何被执行的代码?

在下面的代码中,为什么会提示“OUCH”?

为什么下面的程序在彼此相减时提供“-1 天,23:59:58.233000”类型的输出?

为什么下面的递归主函数以值1作为参数开头?

为什么在JavaScript中(([[] === [])+ /-/)[1] ='a'和(1 + {})[(1 << 1)+1] ='b'是为什么?

为什么打印和回显在“ for”循环中表现不同

为什么“弹性增长”在Chrome和Firefox / Edge中表现不同?

为什么std :: call_once在连接和分离的线程中表现不同?

为什么LF和CRLF在/ ^ \ s * $ / gm正则表达式中表现不同?

为什么多个分配和单个分配在python中表现不同