看一段以下代码:

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‬
image.png

假定二进制是带符号位的, 我们需要给它们转换成十进制, 步骤如下

第一步: 去掉补码 (也就是二进制值减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 

zxyle
47 声望0 粉丝