碰到一个java面试题,题目如下
System.out.println((int)(char)(byte)-1);
请问输出结果为什么是65535 ?

解决方案 »

  1.   

    -1 .二进制表示:   1111 1111
    转char 符号位拓展:  1111 1111 1111 1111
    转int 65535。
      

  2.   

    请问楼上的,为什么转char 符号位拓展: 1111 1111 1111 1111呢?
    转int就是65535了,麻烦讲详细点?谢谢
      

  3.   

    Apeipo 高手 真没见过这样的问题
      

  4.   

    这是有符类型和无符类型的区别
    有符类型,低字节数转换成高字节数时,符号位往前扩展
    无符类型转换,因为没有符号位一说,所以符号位不往前扩展
    java里,byte,short,int,long是有符的,char是无符的
    所以
    (char)(byte)-1,byte向char转换时,因为byte有符,所以符号位扩展
    而(int)(char),即char向int转换时,因为char无符,所以符号位不扩展看个例子
    int a = -1;
    byte b = (byte)a;
    char c = (char)a;
    System.out.printf("a=%d, b=%d, c=%d, (int)b=%d, (int)c=%d\n", 
                      a, b, (int)c, (int)b, (int)c);
    //可见 (int)b还是==-1,但是(int)c就不再是-1了,也就是char向高字节int转换时,
    //符号位不扩展(因为char是无符,也就是没有符号位之说,所以也就没有符号位扩展),
    //而byte有符,所以符号位扩展至于每个类型是否有符,可以查看其最大值最小值
    System.out.printf("byte-min:%d, byte-max:%d, char-min:%d, char-max:%d, int-min:%d, int-max:%d\n",
                      Byte.MIN_VALUE, Byte.MAX_VALUE, 
                      (int)Character.MIN_VALUE, (int)Character.MAX_VALUE, 
                      Integer.MIN_VALUE, Integer.MAX_VALUE);
      

  5.   

    public abstract class openingCeremony {
    protected abstract void raiseFlag();
    protected abstract void swearOfReferee();
    protected abstract void swearOfAthlete();
    protected abstract void announce();
    public void start(){
    raiseFlag();
    swearOfReferee();
    swearOfAthlete();
    announce();
    }
    }
      

  6.   

    System.out.println((int)(char)-1);这样,也是65535
    结果很显然,就是把char类型的2进制-1转化为了int类型的。
    由二进制的编码。即可得65535
      

  7.   

    -1
    -> (byte有正负)                                          11111111 
    -> (char只有正数)是负数扩展符号位1 但变为正数          1111111111111111                    
    -> (int有正负)是正数扩展符号位0     0000000000000000 1111111111111111
                                             =