看一段以下代码:
import java.util.Arrays;
public class Test {public static void main(String[] args) {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)
十六进制: E4 B8 AD
二进制: 1110 0100 1011 1000 1010 1101
去掉补码: 1110 0011 1011 0111 1010 1100
第二步 将补码转换成反码(1 变 0, 0 变 1)
十六进制: E4 B8 AD
二进制: 1110 0100 1011 1000 1010 1101
去掉补码: 1110 0011 1011 0111 1010 1100
反码: 0001 1100 0100 1000 0101 0011
第三步 将反码转换成十进制
十六进制: 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