黑马程序员技术交流社区

标题: byte转int的疑问,负数的二进制形式疑惑 [打印本页]

作者: 风乐    时间: 2013-5-24 19:51
标题: byte转int的疑问,负数的二进制形式疑惑
本帖最后由 风乐 于 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. }
复制代码

作者: tshch1989    时间: 2013-5-24 22:51
计算机存储的是数值的补码,你在运算的时候直接把补码进行了16进制转化,所以不正确
作者: chouwayメ    时间: 2013-5-25 17:41
本帖最后由 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等,是为了保证数据传递的连贯性~  
作者: 风乐    时间: 2013-5-25 19:24
chouwayメ 发表于 2013-5-25 17:41
Java的整数 其基本数据类型都表示有符号的整数.
byte可取的值是-128到127,所能表示的个数也就是256了

额,晓得了,犯了个超低级错误。。。。byte是8位。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2