A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冯晓骏 中级黑马   /  2013-10-24 19:42  /  1414 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

老毕的视频里讲BufferedInputStream,有一段讲到判断返回结束的标记是用int接收,返回-1时结束,但读取的是byte,最后做了一个操作return 0xff
  1. int read()
  2. {
  3.     byte b;
  4.     b = in.read();
  5.     return b&0xff;
复制代码
我想问如果是b是255,先提升了再与上0xff,传给int,不还是32个1么,为什么读出来就变成255了,而不是-1

评分

参与人数 1技术分 +1 收起 理由
李江 + 1 很给力!

查看全部评分

3 个回复

倒序浏览

byte型的b是255,那么是11111111
提升为int型的,为:11111111 11111111 11111111 11111111
在与上0xff即:   
                   11111111 11111111 11111111 11111111                        
                 &00000000 00000000 00000000 11111111
                ——————————————————————————————-
                  00000000 00000000 00000000 11111111
这样一来,即可以保留原字节数据不变,又可以避免-1的出现。而取数据的时候,就会强转只取最低8位的源数据。
总结:参见毕老师笔记
结论:
字节流的读一个字节的read方法为什么返回值类型不是byte,而是int。
因为有可能会读到连续8个二进制1的情况,8个二进制1对应的十进制是-1.
那么就会数据还没有读完,就结束的情况。因为我们判断读取结束是通过结尾标记-1来确定的。
所以,为了避免这种情况将读到的字节进行int类型的提升。
并在保留原字节数据的情况前面了补了24个0,变成了int类型的数值。

而在写入数据时,只写该int类型数据的最低8位。

评分

参与人数 1技术分 +1 收起 理由
李江 + 1 很给力!

查看全部评分

回复 使用道具 举报
楼主你好,如果问题已解决请将帖子状态修改为提问结束,

如果未解决请继续提问,谢谢合作

修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
哥么我写个式子你就懂了

byte b     --->   XXXX XXXX

       0000 0000 0000 0000 0000 0000 XXXX XXXX
  &   0000 0000 0000 0000 0000 0000 1111 1111
----------------------------------------------------------------------
       0000 0000 0000 0000 0000 0000 XXXX XXXX
得到的还是原数了

还有你的b是255,这个是取不到的,会损失精度,byte表示的范围为:-128~127

好好学习哦,不懂得可以问我
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马