(1)public class Multicast {
    public static void main(String[] args) {
       System.out.println((byte) -1);
       System.out.println((char) (byte) -1);
       System.out.println((int) (char) (byte) -1);
    }
}
/*
  运算结果为-1
            ?
            65535
*/
结果是怎么来的啊?
 System.out.println((int) (char) (byte) -1);
一个Int不是4个字节(32位嘛),结果也不可能会出现65535,第二个结果为什么会出现“?”呢(2)public class DosEquis{
   public static void main(String[] args) {
      char x = 'X';
      int i = 0;
      System.out.println(true ? x : 0 );
      System.out.println(true ? x :65536);
      System.out.println(false ? i : x ); 
   }
}
结果是怎么考虑的啊?

解决方案 »

  1.   

    在java中int类型数据占四个字节,数据范围从负的二十几亿到正的二十几亿,是可能出现65535的。
      

  2.   

    在强转成char的时候-1的二进制码为1111111111111111(2个字节) 再强转成int的时候用4个字节去装它自然就是
    2的16次方减1,也就是65535了
      

  3.   

    第二个为结果为? 是因为没有ascii为-1的字符吧
      

  4.   

    你的问题出自《JAVA 解惑》,里面的多重转换。JAVA使用了机遇2的补码的二进制运算,因此int类型的数值-1的所有32为都是1。
    从int到byte的转型时简明的,它砍掉除低8位以外所有位。这样留下的是一个8为都是1的byte,仍然是-1。从byte到char的转型稍微麻烦,因为byte是有符号的,char无符号。单是却不能用一个char表示一个负byte。因此从byte到char的实际操作时:byte -> int -> char 。那么byte的-1变成int,所有位是1,即char的16位至少是1。
    无论是int不溢出,或者是无符号的char,16位为1意味着这个数是2的16次方-1,即65535。 第二道题:
    问题出在混合类型计算。
    简单说过则:
    1、第二、第三操作数具有相同类型,那么着就是表达式的类型。
    2、如果一个操作数是byte/short/char中的一种,另一个操作数是int,并且表达式的结果可以用这三种段类型表示,那么表达式的值是byte/short/char中的一种。
    3、否则,则提升操作数的二进制数,表达式的值是提升后的操作数的运算值。  System.out.println(true ? x : 0 );
      System.out.println(true ? x :65536);
      System.out.println(false ? i : x );  第一个表达式:x的值作为Unicode字符打印,调用PrintStream.print(char)
    第二个表达式:65536超过char上限,做提升,调用PrintSteam.print(int)
    第三个表达式:i首先出现,并且不是true的值,x没有被选择表达式“短路”,一个char和一个int并列,做提升,因此调用PrintStream.print(int),因此char类型的X被转换成88打印出来。谁给的题目?不如直接看书,书上解释的好很多。
      

  5.   

    PS,你的第一题的第二个print被我改成
    System.out.println("["+(char) (byte) -1+"]");结果是:
    -1
    [￿]
    65535自己看吧
      

  6.   

    在强转成char的时候-1的二进制码为1111111111111111(2个字节) 再强转成int的时候用4个字节去装它自然就是
    2的16次方减1,也就是65535了这个是什么意思啊?还是不懂耶??
      

  7.   

    System.out.println(true ? x : 0 );
    System.out.println(true ? x :65536);
    System.out.println(false ? i : x );这个输出语句前面的true和false语句是干什么用的啊?
      

  8.   


    首先,
    清一色补码计算,那么:-1的32位2进制是:
    1111 1111 1111 1111 1111 1111 1111 1111(4字节)
    32位砍成byte(1字节)是
    1111 1111至此,看到的10进制结果都是-1现在,把一个byte的-1转换成char的过程,实际是:
    因为char是无符号的,不能用char表示一个负数,所以这里进行符号扩展,得:
    1111 1111 1111 1111(仍然是-1)把char(无论如何无符号,看做正数)转换成int时,
    因为是正数,因此执行非符号扩展(零扩展),得:
    0000 0000 0000 0000 1111 1111 1111 1111
    这个结果是2的16次方-1,即65535