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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 风乐 中级黑马   /  2013-5-24 19:51  /  1925 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 风乐 于 2013-5-25 19:25 编辑

一般情况下:
byte类型数据转int类型是看原byte型数据二进制形式最高位是0就补0,最高位就补1的?如
byte a = -1;
int b = a;
-1       //为什么1111是-1不是15?
1111  ----->  1111 1111 1111 1111

1
0001 ------>0000 0000 0000 0001

在IO所有操作字节的流里面:
读取字节是直接返回int值的,write方法写单个字节也是write(int b),这里操作把byte转int有特殊操作全补0?
如果是这样的话,这个特殊操作是什么个样子?

这是看到毕老师自定义字节流缓冲区那里的疑惑,自定义需读数据进行&255操作,

代码如下
  1. import java.io.*;

  2. class MyBufferedInputStream
  3. {
  4.         private InputStream in;

  5.         private byte[] buf = new byte[1024*4];
  6.                
  7.         private int pos = 0,count = 0;
  8.         
  9.         MyBufferedInputStream(InputStream in)
  10.         {
  11.                 this.in = in;
  12.         }

  13.         //一次读一个字节,从缓冲区(字节数组)获取。
  14.         public int myRead()throws IOException
  15.         {
  16.                 //通过in对象读取硬盘上数据,并存储buf中。
  17.                 if(count==0)
  18.                 {
  19.                         count = in.read(buf);
  20.                         if(count<0)
  21.                                 return -1;
  22.                         pos = 0;
  23.                         byte b = buf[pos];

  24.                         count--;
  25.                         pos++;
  26.                         return b&255;
  27.                 }
  28.                 else if(count>0)
  29.                 {
  30.                         byte b = buf[pos];

  31.                         count--;
  32.                         pos++;
  33.                         return b&0xff;
  34.                 }
  35.                 return -1;

  36.         }
  37.         public void myClose()throws IOException
  38.         {
  39.                 in.close();
  40.         }
  41. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
袁梦希 + 2 不错,很工整

查看全部评分

4 个回复

倒序浏览
计算机存储的是数值的补码,你在运算的时候直接把补码进行了16进制转化,所以不正确
回复 使用道具 举报
本帖最后由 chouwayメ 于 2013-5-25 18:27 编辑

Java的整数 其基本数据类型都表示有符号的整数.
byte可取的值是-128到127,所能表示的个数也就是256了

--------
关于老师那&255操作的理解:

如果byte a=-1           也就是--> 11111 1111
假设直接return b  那么会被直接转型成int  -->1111 1111 1111 1111    (因为方法返回的值类型为 int)
也就是返回的值也是 -1 那么这个值之后将不再执行while循环.即数据读取不完整.(因为循环的条件不满足)
如果return的是 b&255   
因为这个表达式里,在数据类型可兼容条件下,byte 数据类型的b 被类型提升了,提升成了int型.
则 byte a=-1       -->   1111 1111 1111 1111
    255               -->    0000 0000  1111 1111
   &结果             -->    0000 0000 1111 1111
也就是255了.
也就是说在读取的值为byte b=-1时这种情况时仍可以继续循环,数据的读取能够完整.

另一部分原因:之所以运算&255, 而不是&244等,是为了保证数据传递的连贯性~  

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报 1 0
chouwayメ 发表于 2013-5-25 17:41
Java的整数 其基本数据类型都表示有符号的整数.
byte可取的值是-128到127,所能表示的个数也就是256了

额,晓得了,犯了个超低级错误。。。。byte是8位。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马