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

55次阅读

共计 688 个字符,预计需要花费 2 分钟才能阅读完成。

看一段以下代码:

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 

正文完
 0