字节转换成int类型 出现的问题
package testSWQ;
import java.io.*;
public class TypeCoversionNotsameEvaluate {
/**类型转换与赋值不同
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
new TypeCoversionNotsameEvaluate().bookmethod();
new TypeCoversionNotsameEvaluate().myselfTest();
}
public void bookmethod()
{
byte[] buf = new byte[]{2,12,6,-1,-9,9};
/*-1在byte中的二进制是 11111111(最高位1表示负0表示正 -1十进制=1000 0001取反加1 为
* 取反最高位不变 1111 1110+1=1111 1111 将它转换成int类型在前面加0即为
* 0000 0000 0000 0000 0000 0000 1111 1111 即是int类型的255*/
ByteArrayInputStream in = new ByteArrayInputStream(buf,3,1);
int data =in.read();
while(data!=-1)
{
System.out.println(data+" ");
data = in.read();
}
try {
in.close();
} catch (
IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
public void myselfTest()
{
byte a = -1;
int data2 = a;
System.out.println(data2);
}
}
在书上看见第一个方法 它的-1转换成了255 按照自己的理解写了个程序 为什么没变成255
------解决方案--------------------Java code
byte a = -1;
// -1在byte中的二进制是 11111111
int data2 = a;
// 当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位
// 补码11111111的十进制数为-1转换为int时变为11111111111111111111111111111111
------解决方案--------------------
1、 -1的原码是1000 0001, 补码为1111 1111(看来负数直接就用补码了--化减为加)
2、 而Java中byte转int是值的转换,即模为8的-1补码,转换为模为32的-1补码,如下:
-1原码1000 0001,符号位后,补0补齐32位,如下:
1000 0000 0000 0000 0000 0000 0000 0001 (-1的模为32位的原码)
1111 1111 1111 1111 1111 1111 1111 1111 (-1的模为32位的补码)
0000 0000 0000 0000 0000 0000 1111 1111 (oxff的二进制) (按为与)
0000 0000 0000 0000 0000 0000 1111 1111 = 按位与后的结果,在int中很明显为255。
3、因为正数的补码与本身相等,符号位也为0,所以8转32时,直接在前面补0就好了。