2 回答

TA貢獻1982條經驗 獲得超2個贊
為什么Java沒有像char unsigned 16 bits那樣實現它?我的意思是它會在 0.256 的范圍內,因為從 0 到 127 我只能保存一個 Ascii 值,但是如果我將值設置為 200 會發生什么,擴展的 ascii 會溢出到 -56。
Java 的原始數據類型在 25 年前的 Java 1.0 中得到了解決。不到兩年前,Java 9 中引入了緊湊字符串。這個新特性只是一個實現細節,并不能證明 Java 類型系統的根本變化是合理的。
除此之外,您正在查看存儲在一個字節中的數據的一種解釋。為了表示 iso-latin-1 單位,將相同的數據解釋為 Java 內置的 signedbyte是否會導致正數或負數完全無關緊要。
同樣,Java 的 I/O API 允許將文件讀入byte[]數組并將數組寫byte[]回文件,這兩個操作已經足以無損地復制文件,而不管其文件格式在解釋其內容時是否相關。
所以從 Java 1.1 開始以下工作:
byte[] bytes = "è".getBytes("iso-8859-1");
System.out.println(bytes[0]);
System.out.println(bytes[0] & 0xff);
-56
200
這兩個數字,-56和200只是位模式的不同解釋,而包含位模式的11001000iso-latin-1 解釋是字符。byte11001000è
值char也只是對兩個字節數量的解釋,即作為 UTF-16 代碼單元。同樣,char[]數組是計算機內存中具有標準解釋的字節序列。
我們也可以用這種方式解釋其他字節序列。
StringBuilder sb = new StringBuilder().appendCodePoint(128048);
byte[] array = new byte[4];
StandardCharsets.UTF_16LE.newEncoder()
.encode(CharBuffer.wrap(sb), ByteBuffer.wrap(array), true);
System.out.println(Arrays.toString(array));
將打印您看到的值,[61, -40, 48, -36].
在類中使用byte[]數組的優點String是,現在可以選擇解釋,當所有字符都可以用這種編碼表示時使用 iso-latin-1,否則使用 utf-16。
可能的數字解釋與字符串無關。但是,當你問“Java 怎么知道 -56 值與 200 相同”時,你應該問自己,它是如何知道11001000abyte的位模式-56在首位的?
System.out.println(value[0]);
與普通計算機算術相比,a byte(或 an int)到 a的轉換實際上是一個昂貴的操作String。這種轉換操作經常被忽略,因為它已被定義為打印 a 的默認方式,但并不比將值解釋為無符號數量byte的轉換更自然。String為了進一步閱讀,我推薦二進制補碼。

TA貢獻1909條經驗 獲得超7個贊
這是因為并非字符串中的所有字節都被解釋為相同的。這取決于字符串的字符編碼。
例子:
如果字符串是 UTF-8 字符串,則其字符大小為 8 位。
在 UTF-16 字符串中,其字符大小為 16 位。
ETC...
這意味著,如果要將字符串表示為 UTF-8,則字符將通過一次讀取 1 個字節來生成;如果是 16 位,則字符將通過一次讀取 2 個字節來生成。
看這段代碼:data
使用 UTF-8 和 UTF-16 將單字節數組轉換為字符串。
byte[] data = new byte[] {97, 98, 99, 100};
System.out.println(new String(data, StandardCharsets.UTF_8));
System.out.println(new String(data, StandardCharsets.UTF_16));
這段代碼的輸出是:
abcd // 4 bytes = 4 chars, 1 byte per char
慢捤 // 4 bytes = 2 chars, 2 byte per char
回到這個問題,開發人員這樣做的動機是減少字符串的內存占用。并非所有字符串都使用所有 16 位 achar報價。
添加回答
舉報