本帖最后由 sysabod 于 2009-08-19 12:25:59 编辑

解决方案 »

  1.   

    b&0xff: 这个把扩展了的符号位清为零了。char c=(char) b;这个没有。
      

  2.   

    但是语句(char)(b&oxff)先执行b&0xff,那么b&0xff=b,这样的结果不是两个都一样吗?
      

  3.   

    在java中,byte到char的转换不是直接进行的。
    而是byte符号扩展转换到int,然后再从int转换到char。
      

  4.   

    看来你还没有搞清符号们的扩展吧?举一个例子:byte b=-100;
    b在内存中是以补码的形式存贮的:
    1001 1100如果执行char c=(char)b;
    如3楼企鹅先生所说:b要先变为int,这时增加的位全要用b的符号位填充(这就是符号扩展),变为:
    1111 1111 1111 1111 1111 1111 1001 1100下步是强制类型转换,只保留了最低的两个字节:1111 1111 1001 1100。如果执行char c=(char)(b&0xff),同样b要转为int ,同时符号位扩展:
    1111 1111 1111 1111 1111 1111 1001 1100再与0xff想与,
     1111 1111 1111 1111 1111 1111 1001 1100
    &0000 0000 0000 0000 0000 0000 1111 1111
    -----------------------------------------
     0000 0000 0000 0000 0000 0000 1001 1100
    再强转为char,得: 0000 0000 1001 1100。这是一个正数。