Tag: expression evaluation

++ i + i ++评估

由于这篇文章,混乱上升了。 作者更新了他的post,结果变得清晰。 结论:Java 从左到右评估表达式 关闭! 由于表达式的评估是从右到左完成的,因此以下代码应该在j存储5 : int i=2; int j=++i+i++; System.out.println(j); 但我得到6作为输出,这迫使我重新思考左右评价的想法。 请在这里解释一下理论。

Java strictfp修饰符对现代CPU有影响吗?

根据JLS,我知道strictfp修饰符对方法(和类)的含义: JLS 8.4.3.5,strictfp方法: strictfp修饰符的作用是使方法体内的所有float或double表达式都是显式FP-strict(第15.4节)。 JLS 15.4 FP-strict表达式: 在FP-strict表达式中,所有中间值必须是浮点值集或双值集的元素,这意味着所有FP严格表达式的结果必须是IEEE 754算法在使用单格式和双格式表示的操作数上预测的结果。 在不是FP-strict的表达式中,为实现授予了一些余地,以使用扩展指数范围来表示中间结果; 粗略地说,净效应是在独占使用浮点值集或双值集可能导致上溢或下溢的情况下,计算可能会产生“正确答案”。 我一直试图找到一种方法来获得strictfp方法中的表达式和非strictfp的表达式之间的实际差异。 我在两台笔记本电脑上试过这个,一台配备英特尔酷睿i3 CPU,另一台配备英特尔酷睿i7 CPU。 我不能有任何区别。 很多post都建议原生浮点(不使用strictfp )可以使用80位浮点数,并且在最小可能的java双精度(最接近零)或高于最高可能的64位java双strictfp之下具有额外的可表示数字。 我使用和不使用strictfp修饰符尝试了下面的代码,它给出了完全相同的结果。 public static strictfp void withStrictFp() { double v = Double.MAX_VALUE; System.out.println(v * 1.0000001 / 1.0000001); v = Double.MIN_VALUE; System.out.println(v / 2 * 2); } 实际上,我假设任何差异只会在代码编译成程序集时出现,所以我使用-Xcomp JVM参数运行它。 但没有区别。 我发现另一篇文章解释了如何获取HotSpot生成的汇编代码( OpenJDK文档 )。 我用java -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly运行我的代码java -Xcomp -XX:+UnlockDiagnosticVMOptions […]