System.out.println((int)(char)(byte)-1);为什么输出结果是65535?byte向char转换,以及char向int转换时区别怎么这么大?恳请知道的高手给予解答,谢谢!

解决方案 »

  1.   

    (byte)-1是8个1,此时仍然等于-1
    转换成char就是16个1,char没有符号,等于65535
    再换成int,前面补16个0,还是65535
      

  2.   

    关键是byte转char,它不是widening primitive conversion,而是windening and narrowing primitive conversion,因为无法用一个负数去表示一个无符号数char,这样就等于把原数变大了
      

  3.   

    Java中的数据是以补码的形式储存的
      

  4.   

    整个过程把整型-1转换为65535,int占8个字节,二进制表示32位,在计算机中是11111111111111111111111111111111,有符号转换为byte时,byte占4个字节,二进制16位,计算机中是上述一半,1111111111111111,有符号转换为char时,char占4个字节,16位,表示为1111111111111111,无符号然后转换为int,int占8个字节,32位,表示为00000000000000001111111111111111最终结果为65535参考文章:
        Java中的byte
        http://blog.csdn.net/nethibernate/article/details/5578911
      

  5.   

    是不是在byte-->char-->int的过程中,高位都是补的原来的符号位?而因为char是无符号,所以高位都是补0?
      

  6.   

    6楼nice 
     分享的文章不错!
      

  7.   

    -1最先是一个int类型的数据
    100000000 00000000 000000000 000000001(byte)-1得到  100000001(char)-1 因为 会自动扩展符号位
    得到
    10000000 00000001
    反码得到
    11111111 11111110
    补码
    11111111 11111111 由于char是 无符号的,所以计算方式是2^16 + 2^15+2^14+。。+2^2+2^1+2^0
    根据等比数列公式 Sn=a1(1-q^n)/(1-q)  = 1*(1-2^16)/(1-2) = 2^16 - 1 = 65536 - 1 = 65535 (本质....数据类型的长度也是这么计算)
    PS. 如果 short 那就不一样了! 首位是符号位了。将其转换为int得到
    000000000 00000000 11111111 11111111  = 65535