我得到一个枚举,其中每个枚举常量都有一个字节和一个接口的对象(通过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的十进制等值是什么。
发生了什么事?
答案 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))