日期:2014-05-20  浏览次数:20721 次

字节转换成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就好了。