字节神奇地改变了

时间:2016-01-17 14:00:51

标签: java enums byte

我得到一个枚举,其中每个枚举常量都有一个字节和一个接口的对象(通过lambda)

//...
public enum InstructionSet {
  //...
  INSTRUCTION_HALT((byte) 0xF0, (ticksSinceStart) -> {
      return halt(ticksSinceStart);
  });


  private final byte opCode;
  private MicroOperationPlan plan;

   private InstructionSet(byte opCode, MicroOperationPlan opPlan) {
       this.opCode = opCode;
       this.plan = opPlan;
   }

   //...

   public byte getOpByte() {
       return this.opCode;
   } 
}

现在我在main方法中得到了一个调试输出。在我的main方法之前没有更多的代码被执行。字节' opCode'在我的枚举中是最终的,所以它无法改变。 调试指令:

public static void main(String[] args) {
    System.out.println(Integer.toHexString(InstructionSet.INSTRUCTION_HALT.getOpByte()));

  //...
}

我认为应该打印到终端:f0

打印到终端的内容:fffffff0

当我没有将它转换为十六进制字符串时,它仍然将-16打印到终端,fffffff0的十进制等值是什么。

发生了什么事?

1 个答案:

答案 0 :(得分:1)

使用默认的符号继承方法1111 0000将字节1111 1111 1111 1111 1111 1111 1111 0000扩展为四个字节,然后转换为十六进制字符串。

正如JB Nizet所指出的,字节是用Java签名的,因此byte的值不能高于127;如果设置了高位,则它们是负数。

因此,您必须撤消默认的符号继承行为,例如

System.out.println(Integer.toHexString(InstructionSet.INSTRUCTION_HALT.getOpByte() & 0xFF))