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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© M路 中级黑马   /  2014-7-15 14:45  /  959 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 M路 于 2014-7-16 11:39 编辑
  1.         public int myRead()throws IOException
  2.         {
  3.                 //通过in对象读取硬盘上数据,并存储buf中。
  4.                 if(count==0)
  5.                 {
  6.                         count = in.read(buf);
  7.                         if(count<0)
  8.                                 return -1;
  9.                         pos = 0;
  10.                         byte b = buf[pos];

  11.                         count--;
  12.                         pos++;
  13.                         return b&255;
  14.                 }
  15.                 else if(count>0)
  16.                 {
  17.                         byte b = buf[pos];

  18.                         count--;
  19.                         pos++;
  20.                         return b&0xff;
  21.                 }
  22.                 return -1;

  23.         }
复制代码
类型转换问题,这是毕老师java基础第19天-14里面的一段代码,关于类型转换,我有些疑问。在return b&255 的时候,b本来是byte类型的,提升为int类型,之所以要与上255,是为了避免读到11111111的时候,while循环结束,我不明白的地方是,当b为11111111的时候与上255结果还是11111111,这样提升为int之后不还是32个1吗?为什么提升完之后是24个0加8个1?

6 个回复

倒序浏览
fantacyleo 来自手机 金牌黑马 2014-7-15 15:17:04
沙发
位运算会先做类型提升到int再运算。所以b和255会先被提升为32位,再做&
回复 使用道具 举报
b为11111111,255为00000000-00000000-00000000-11111111
b&255,首先b提升为11111111-11111111-11111111-11111111
0&1=0,1&1=1

如此以来,b&255=00000000-00000000-00000000-11111111,仍旧是int型
回复 使用道具 举报
当一个java算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。Java定义如下的自动提升规则:
1. 所有byte型、short型和char型将被提升到int型。
2. 整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。
在 b&255 中,b首先被提升到 int ,如 b = -1 即为 11111111-11111111-11111111-11111111,然后才进行运算,
而 255 本身是 int ,即 00000000-00000000-00000000-11111111,
& 运算后得 00000000-00000000-00000000-11111111
写入时 write() 读取最后 8 位,即 11111111, 与 b 相同,但 b&255 = 255 而不等于 -1,避免了循环意外结束。
回复 使用道具 举报
icris 发表于 2014-7-15 22:39
当一个java算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。Java定义如下的 ...

原来是先要转换为int型,感谢你!我明白了!
回复 使用道具 举报
wisely 发表于 2014-7-15 19:53
b为11111111,255为00000000-00000000-00000000-11111111
b&255,首先b提升为11111111-11111111-11111111-1 ...

感谢!明白了!
回复 使用道具 举报
M路 中级黑马 2014-7-16 11:37:17
7#
fantacyleo 发表于 2014-7-15 15:17
位运算会先做类型提升到int再运算。所以b和255会先被提升为32位,再做&

感谢!明白了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马