最近研究I/O流,发现read()方法返回的是int类型,原来是将一个byte读入到一个int,有效的数据只占据int型变量的最低8位。在正常情况下这个int型的变量永远都不可能是负数。
什么是高低位?
一个Byte是8位(bit),其中的“8位”指的是8位2进制数。byte范围是-128--127,如果输入超过这个数值,会编译错误。
如8位二进制数:11001010;1100就是高4位,后面的1010就是低4位。
什么是低8位?
一个int类型的变量能存放4Byte,也就是能存放32位二进制数,而一个32位二进制数中权值最大的24位就是高24位,那么剩下的就是低8位。
如何将byte转换为int?
需要将前24位去除,也就是转换为0。Java对byte总是做有符号处理;
所以可以通过将byte和0xff进行二进制“&“得到它的无符值。
例如:
byte的二进制为:11001010;
0xff的二进制为:11111111;
1111111111111111111111111 11001010 & 11111111 = 000000000000000000000000 11001010
上面的例子为什么会添加这么多“1”?
当系统检测到byte可能会转化成int或者说byte与int类型进行运算的时候,就会将byte的内存空间高位补1(也就是按符号位补位)扩充到32位