2013-05-29 39 views
1

我需要一個無符號的8位整數在Java中,char似乎是唯一接近的。雖然它的大小是它的兩倍,但是它沒有簽名,這使得我想用它來實現它(編寫一個需要無符號字節的基本模擬器)。問題是,我聽說其他程序員說,不應該以這種方式使用char,而應該使用int或其他。這是真的嗎?爲什麼?使用char作爲Java中的無符號16位值?

回答

3

如果您需要一個無符號的8位整數,然後使用byte。這很容易使其在arithemtic操作(其中實際簽名事項)未簽名爲byteValue & 0xFF

+0

是的我已經做了這樣的事情,但與「包裝」對象。如果你不介意,你能查看我對武東的評論嗎? – ZimZim

+0

如果你需要效率,這是一個壞主意,如果效率不是問題,那麼UnsignedByte類而不是java.lang.Byte是個好主意 –

2

使用byte表示一個帶有一些小轉換的無符號8位整數是完全合理的,或者的UnsignedBytes轉換爲您。

+0

是的,我認爲這樣的東西會是一個很好的解決方案。我創建了一個具有字節字段的「包裝器」,基本上將負值解釋爲256 +值(即236將在字節中保存爲-20,然後解釋爲-20 && 256,即236)。我認爲這樣可以,但是這不會造成很大的開銷,尤其是因爲創建了一個新的Object,即使它是空的,仍然會使用8個字節?這通常不會成爲一個問題,但是我正在模擬仿真,我認爲仿真器需要儘可能高效。 – ZimZim

2

在Java:

長:[-2^63,2^63 - 1]

INT:[ - 2^31,2^31 - 1]

短:[-2^15,2^15 - 1]

字節:[-2^7,2^7 - 1]

char:[0,2^16 - 1]

你想要一個無符號的8位整數意味着你想要一個[0,2^8 - 1]之間的值。顯然選擇short/int/long/char。

儘管char可以被視爲一個無符號整數,但我認爲這是一種糟糕的編碼風格,除了字符以外的任何東西都使用char。

例如,

public class Test { 
public static void main(String[] args) { 
    char a = 3; 
    char b = 10; 

    char c = (char) (a - b); 
    System.out.println((int) c); // Prints 65529 
    System.out.println((short) c); // Prints -7 

    short d = -7; 
    System.out.println((int) d); // Prints -7, Please notice the difference with char 
} 

}

這是更好/長使用短/ INT與轉換。

相關問題