黑马程序员技术交流社区
标题:
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操作,
代码如下
import java.io.*;
class MyBufferedInputStream
{
private InputStream in;
private byte[] buf = new byte[1024*4];
private int pos = 0,count = 0;
MyBufferedInputStream(InputStream in)
{
this.in = in;
}
//一次读一个字节,从缓冲区(字节数组)获取。
public int myRead()throws IOException
{
//通过in对象读取硬盘上数据,并存储buf中。
if(count==0)
{
count = in.read(buf);
if(count<0)
return -1;
pos = 0;
byte b = buf[pos];
count--;
pos++;
return b&255;
}
else if(count>0)
{
byte b = buf[pos];
count--;
pos++;
return b&0xff;
}
return -1;
}
public void myClose()throws IOException
{
in.close();
}
}
复制代码
作者:
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