字节神奇地变化

Byte changes magically

我得到一个枚举,其中每个枚举常量都有一个字节和一个接口对象(通过 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 方法中得到了调试输出。在我的主要方法之前没有执行更多代码。字节 'opCode' 在我的枚举中是最终的,因此无法更改。 调试指令:

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

  //...
}

我认为应该在终端中打印的内容:f0

终端打印的内容:fffffff0

当我不将其转换为十六进制字符串时,它仍将 -16 打印到终端,fffffff0 的小数点是多少。

发生了什么事?

一个字节,1111 0000,使用默认的sign-inheriting方法扩展为四个字节:1111 1111 1111 1111 1111 1111 1111 0000,然后转换为十六进制字符串。

正如 JB Nizet 指出的那样,字节在 Java 中签名,因此 byte 的值不能超过 127;如果设置了高位,则为负。

因此,您必须撤消默认的 sign-inheriting 行为,例如

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