看一段以下代码:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
// 将中字转换成byte数组
byte[] bytes = "中".getBytes();
System.out.println(Arrays.toString(bytes)); // 输出[-28, -72, -83]
}
}
为什么中文的中
转换成byte
类型后 就变成了[-28, -72, -83]
原理如下
在utf-8编码中, 一个中文字符占用3个字节.
在GBK编码中, 一个中文字符占用2个字节.
我们在这个网站查询中
字的utf-8
编码16进制是 E4B8AD
对应的二进制是11100100 10111000 10101101
假定二进制是带符号位的, 我们需要给它们转换成十进制, 步骤如下
第一步: 去掉补码 (也就是二进制值减1)
进制 | 字节1 | 字节2 | 字节3 |
---|---|---|---|
十六进制 | E4 | B8 | AD |
二进制 | 1110 0100 | 1011 1000 | 1010 1101 |
去掉补码 | 1110 0011 | 1011 0111 | 1010 1100 |
第二步: 将补码转换成反码(1变0, 0变1)
进制 | 字节1 | 字节2 | 字节3 |
---|---|---|---|
十六进制 | E4 | B8 | AD |
二进制 | 1110 0100 | 1011 1000 | 1010 1101 |
去掉补码 | 1110 0011 | 1011 0111 | 1010 1100 |
反码 | 0001 1100 | 0100 1000 | 0101 0011 |
第三步: 将反码转换成十进制
进制 | 字节1 | 字节2 | 字节3 |
---|---|---|---|
十六进制 | E4 | B8 | AD |
二进制 | 1110 0100 | 1011 1000 | 1010 1101 |
去掉补码 | 1110 0011 | 1011 0111 | 1010 1100 |
反码 | 0001 1100 | 0100 1000 | 0101 0011 |
十进制 | 28 | 72 | 83 |
第四步: 带上符号位(负号)
结果: -28 -72 -83
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。