为什么在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

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 为什么在java中文转bytes是负数 zxyle

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址