Java字节码指令的if语句

时间:2019-02-21 14:49:19

标签: java

我有以下Java类:

public class ArtClassInt {
   public boolean foo(int x) {
      if(x == 3956681)
        return true;
      else
        return false;
   }

   public boolean boo(int x) {
      if(x <= 952140568)
        return true;
      else
        return false;
   }

   public boolean boo1(int x, int y) {
      if(x <= y)
        return true;
      else
        return false;
   }

   public boolean zoo(int x) {
      if(x+1 < 1267)
        return true;
      else
        return false;
   }
}

当我编译它并获取其字节码时,得到了与源代码中的if语句相对应的以下语句:

ArtClassInt.boo1(II)Z: I4 Branch 3 IF_ICMPGT L17 - true
ArtClassInt.boo1(II)Z: I4 Branch 3 IF_ICMPGT L17 - false
ArtClassInt.boo(I)Z: I4 Branch 2 IF_ICMPGT L10 - true
ArtClassInt.boo(I)Z: I4 Branch 2 IF_ICMPGT L10 - false
ArtClassInt.foo(I)Z: I4 Branch 1 IF_ICMPNE L3 - true
ArtClassInt.foo(I)Z: I4 Branch 1 IF_ICMPNE L3 - false
ArtClassInt.zoo(I)Z: I6 Branch 4 IF_ICMPGE L24 - true
ArtClassInt.zoo(I)Z: I6 Branch 4 IF_ICMPGE L24 - false

我对助记符感到困惑(例如IF_ICMPGEIF_ICMPNE等)。通过查看源代码,我期望:

  • foo方法中的if语句不应为if_icmpeq IF_ICMPNE
  • booboo1方法中的if语句应 是if_icmple而不是IF_ICMPGT
  • zoo中的一个应该是 if_icmplt不是IF_ICMPGE

有人可以解释其背后的原因吗?

2 个答案:

答案 0 :(得分:2)

测试的条件被反转,因为如果条件为真,则它会跳转(跳至else块,否则将继续执行下一条指令。

答案 1 :(得分:2)

我猜您不应该假设您的语句应逐字转换为字节码。

唯一相关的是语义应该相同。在中间代码中将条件转换为对应条件的情况很常见,请考虑一下while循环:

while (x < y) {
  code;
}

可以编译为

START:
  CMP x y
  JMPGE END
  CODE
  JMP START
END:
  ...

您看到的是反转条件,这是一个常见的成语。这是因为反向条件允许您跳出一个块,因此仅当相反情况成立时才执行它。