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

解决方案 »

  1.   


    byte a = -1;
    // -1在byte中的二进制是 11111111
    int data2 = a;
    // 当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位
    // 补码11111111的十进制数为-1转换为int时变为11111111111111111111111111111111
     正确的做法是
    byte a = -1;
    int data2 = a & 0xFF; // 高位清零
    http://www.diybl.com/course/3_program/java/javashl/200855/112901.html
      

  2.   

    单纯转型的话用Integer.parseInt就可以了。
    这段代码不是在转型,而是在提取文字的2进位数值。
      

  3.   

    想问下类型转换什么时候 补0什么时候补1  还有和0xff安位于 不就是和 1111 1111与吗 这里只有8个1啊 byte转int 多了24个1 
    能写详细点吗 我看过你给的连接了 还是没怎么懂 
      

  4.   


    lz 需明白直接的 byte -> int 转换是值转换,转换前后的值相等正整数的话,两者的低 8 位相同,int 的其它补成 0因为负整数采用的是补码,两者的低 8 位相同,转换成 int 时自然需要在高位补 1而 lz 要的是 byte 类型的各 bit 的值,不考虑正负转换成 int 类型后低 8 位还是一样的, &0xFF 就能取出这低 8 位,去掉高位多余的部分
      

  5.   

     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就好了。