(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 );
}
}
结果是怎么考虑的啊?
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 );
}
}
结果是怎么考虑的啊?
2的16次方减1,也就是65535了
从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打印出来。谁给的题目?不如直接看书,书上解释的好很多。
System.out.println("["+(char) (byte) -1+"]");结果是:
-1
[]
65535自己看吧
2的16次方减1,也就是65535了这个是什么意思啊?还是不懂耶??
System.out.println(true ? x :65536);
System.out.println(false ? i : x );这个输出语句前面的true和false语句是干什么用的啊?
首先,
清一色补码计算,那么:-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