字节神奇地变化
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))
我得到一个枚举,其中每个枚举常量都有一个字节和一个接口对象(通过 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))