java 中关于字节流字符流的疑问

这个貌似有点复杂。。。。System.out.println("“中”的第一个字节是:"+"中".getBytes("GBK")); //输出-42 System.out.println("“中”的第二个字节是:"+"中".getBytes("GBK")); //输出-48 中这个字使用GBK编码(不是BGK啊题主。。)会占用两个字节,两个字节的内容分别是11010110(换成10进制就是-42)和11010000(-48),所以上面输出结果不用解释了。System.out.println((byte)\u0026#39;中\u0026#39;); // 45System.out.println(\u0026#39;中\u0026#39;+1-1); // 2001345对应二进制:0010 110120013对应二进制:0100 1110 0010 1101(上面输出的时候是int,然而\u0026#39;中\u0026#39;只是一个char,也就是两个字节)。注意比较一下这两个的二进制。然后一个比较关键的地方来了:Java平台内部统一使用UTF-16编码格式一个中字用UTF-16编码后是4个字节:byte bytes = "中".getBytes("UTF-16");for (byte b : bytes) { System.out.println(b);}结果是:-2-17845上面这四个数对应的二进制:11111110 11111111 01001110 00101101换成16进制吧,我眼花了。。 fe ff 4e 2dwindows内存中低字节放在内存的高位,也就是 2d 4e ff te所以 (byte)\u0026#39;中\u0026#39; 就只要一个字节,也就是8位,也就是2d,也就是00101101,也就是上面的45呢~而 \u0026#39;中\u0026#39;+1-1 中的\u0026#39;中\u0026#39;是一个char类型,也就是两个字节,它去内存里面直接读两个子节的数据就是了,以两个字节为单位看这块内存,它变成了4e2d teff,于是读到了4e2d,也就是01001110 00101101,换成10进制也就是20013.附:11111110 11111111 01001110 00101101换成10进制是-16822739。查看它在内存里面是什么样子的:使用1字节查看是:2d 4e ff fejava 中关于字节流字符流的疑问
【java 中关于字节流字符流的疑问】
使用2字节查看是:4e2d feffjava 中关于字节流字符流的疑问

在我这里C里面的int是4个字节,short是2个字节,char是一个字节,对于-16822739这个int型的数据,占了4个字节,我们把每个字节当成一个char,按照上面的图可以看出依次应该是2d 4e ff fe,也就是45 78 -1 -2,。还可以分成两个short,结果将是4e2d feff,也就是20013 -257:java 中关于字节流字符流的疑问

水平有限,很大可能是错漏百出,还请路过的大神指正。
■网友
1.reader 并不知道什么时候读一个字节还是两个字节 你构造的时候会告诉他一个编码格式 这个编码格式一个字符是几个字节一次就读几个字节。你调用的这个构造没有显式说明 实际是用的jdk默认的编码格式 你看一下reader的这个构造方法源码就明白了2.汉字中是char类型 2字节 你的这个sysout实际上是做了一个char到byte的强制转换 2字节到1字节 有数据丢失 为什么是45 你查一下这个汉字unicode的值 再做下转换就明白了
■网友
电脑只认识01所以所有文件在底层都是以01的不同组合来存储的。将这些数据转化成我们认识的文字都需要通过查询编码表,所以这个问题也可以问成计算机是怎么知道该读几位二进制然后去查表。像ASCII码表都是一个字节的(八位二进制),但是实际上只用了7位二进制,也就是说ASCII码表所有的字符的第一个二进制位是一样的。而GBK是两个字节(也就是16个二进制位),其实16个二进制位也没有全部用完,而是只用后面几位二进制,前面几位是固定数字,也就相当于在每个字节的开始做了标记,告诉计算机你看到这个标记就知道这需要读两个字节然后去查码表找对应字符


推荐阅读