转载

为什么在java中文转bytes是负数 zxyle

看一段以下代码:

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‬
为什么在java中文转bytes是负数 zxyle

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

第一步 去掉补码 (也就是二进制值减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
原文  https://segmentfault.com/a/1190000023021836
正文到此结束
Loading...