我需要一個無符號的8位整數在Java中,char似乎是唯一接近的。雖然它的大小是它的兩倍,但是它沒有簽名,這使得我想用它來實現它(編寫一個需要無符號字節的基本模擬器)。問題是,我聽說其他程序員說,不應該以這種方式使用char,而應該使用int或其他。這是真的嗎?爲什麼?使用char作爲Java中的無符號16位值?
1
A
回答
3
如果您需要一個無符號的8位整數,然後使用byte
。這很容易使其在arithemtic操作(其中實際簽名事項)未簽名爲byteValue & 0xFF
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與轉換。
相關問題
- 1. 將Java int的底部16位作爲帶符號的16位值獲取
- 2. 將無符號16位int轉換爲C#中有符號16位int int#
- 3. 無符號16位和64位整數
- 4. 比特移位`char`與`無符號char`
- 5. 將16位帶符號的PCM轉換爲帶有符號的16位
- 6. QT轉換16位QImage爲8位無符號字符在QT
- 7. 將帶符號的13位值轉換爲帶符號的16位
- 8. 16位無符號整數(uint16_t)
- 9. Qt QByteArrays + 16位無符號整數
- 10. 將無符號char *數組作爲位圖進行Vizualize
- 11. 用兩個無符號的16位整數表示一個無符號的32位值
- 12. SSE無符號/符號的16位寄存器減法
- 13. const的無符號字符*爲char *
- 14. 符號擴展到16位
- 15. 將字符串拆分爲16號字符char
- 16. 投無符號字符*(uint8_t *)爲const char *
- 17. 代表16位有符號整數作爲0-100之間的值
- 18. 從BitArray轉換爲16位無符號整數在C#
- 19. 將char *值存儲到無符號char **數組中
- 20. 將原始二進制8位無符號文件轉換爲16位無符號的Python成像庫
- 21. 在Clojure中的無符號16位整數
- 22. 將值轉換爲無符號32位
- 23. 學位符號的UTF 16代碼
- 24. 在醫學圖像中將有符號16位轉換爲無符號8位時有什麼好處?
- 25. 轉換無符號長爲char *
- 26. 轉換爲unsigned char無符號整數*
- 27. 需要將16位無符號大端字節解碼爲Haskell中的整數
- 28. 存儲在一個無符號的16位整數的RGB
- 29. 使用不同多項式符號的CRC - 16位查找表
- 30. 如何將無符號16位和無符號32位整數編碼爲無符號8位存儲器陣列?
是的我已經做了這樣的事情,但與「包裝」對象。如果你不介意,你能查看我對武東的評論嗎? – ZimZim
如果你需要效率,這是一個壞主意,如果效率不是問題,那麼UnsignedByte類而不是java.lang.Byte是個好主意 –