2016-01-17 26 views
0

字節改變神奇

//... 
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; 
    } 
} 

現在,我在我的主要方法的調試輸出,每一個枚舉常量有一個字節的接口(通過拉姆達)的一個對象的枚舉。在我的主要方法中沒有更多的代碼被執行。字節'opCode'在我的枚舉中是最終的,所以它不能被改變。 調試指令:

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

    //... 
} 

我覺得應該打印到終端:F0

什麼是印刷到終端:FFFFFFF0

如果我不將它轉換爲十六進制的字符串,它仍將-16打印到終端中,與fffffff0相當的小數是多少。

發生了什麼事?

+0

您正在將整數轉換爲十六進制字符串,但您從字節開始。它將字節0xF0擴展爲0xFFF0(或0xFFFFFFF0)的整數。嘗試使用十六進制的BYTE轉換。 – Grantly

+1

它看起來像'java.lang.Byte'沒有任何非十進制基數的字符串轉換方法。 – afk5min

回答

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)) 
+0

我想到了這種可能性,但我無法想象一個原因。如果字節小於0x10(因此爲0x0-0xF),代碼將起作用。當它被轉換爲整數時,爲什麼要將數字240填充到-16,但是將0x3填充到3(所以使用0000'0000字節?) – Cydhra

+1

@Cydhra字節是用Java簽名的。沒有值爲240的字節。字節從-128到127. –

+0

是的,我明白了。謝謝。 – Cydhra