前文再继, 书接上一回:
疑惑从这里来, 答案自己想。
(1)多重转型:
public class Multicast{
public static void main (String[] args){
System.out.println((int)(char)(byte) -1);
}
}
答案肯定不会那么简单的 :evil: , 下面给点提示 8) :
首先, 转换顺序是从右到左的,也就是说从32位硬制转换成8位,再转成16位,最后转成32位;
然后,JAVA使用的是基于补码的二进制运算;
最后,很重要的一点,byte是一个有符号类型,char是无符号类型;从byte转换成char,需要先转换成int,再转成char;转换规则可总结为:
如果最初的数值类型是有符号的,那么就执行符号扩展;如果它是char,那么不管它将要被转换成什么类型,都执行零扩展 :shock: 。
(2)互换内容
学C++或C的同志们,这里要小心了public class CleverSwap{
public static void main(String[] args){
int x = 1984; // (0x7c0)
int y = 2001; // (0x7d1)
x^= y^= x^= y;
System.out.println("x= " + x + "; y= " + y);
}
}
提示:Java语言规范描述到:操作符的操作数是从左向右求值的。
(3)Dos Equis
public class DosEquis{
public static void main(String[] args){
char x = 'X';
int i = 0;
System.out.println(true ? x : 0);
System.out.println(false ? i : x);
}
}
这里需要注意三元操作符的返回类型问题:
如果第二个和第三个操作数具有相同的类型,那么它就是条件表达式的类型。换句话说,你可以通过绕过混合类型的计算来避免大麻烦。
如果一个操作数的类型是T,T表示byte、short或char,而另一个操作数是一个int类型的常量表达式,它的值是可以用类型T表示的,那么条件表达式的类型就是T。
否则,将对操作数类型运用二进制数字提升,而条件表达式的类型就是第二个和第三个操作数被提升之后的类型。
(4)自己运行一下就知道了 :evil:
public class LastLaugh{
public static void main(String[] args){
char[] numbers = {'1', '2', '3'};
System.out.print("H"+"a");
System.out.print('H'+'a');
System.out.print("check out "+numbers);
System.out.print(numbers);
// \u0022 是双引号的Unicode转义字符
System.out.println("a\u0022.length()+\u0022b".length());
}
}
这么简单,没得提示!
疑惑从这里来, 答案自己想。
(1)多重转型:
public class Multicast{
public static void main (String[] args){
System.out.println((int)(char)(byte) -1);
}
}
答案肯定不会那么简单的 :evil: , 下面给点提示 8) :
首先, 转换顺序是从右到左的,也就是说从32位硬制转换成8位,再转成16位,最后转成32位;
然后,JAVA使用的是基于补码的二进制运算;
最后,很重要的一点,byte是一个有符号类型,char是无符号类型;从byte转换成char,需要先转换成int,再转成char;转换规则可总结为:
如果最初的数值类型是有符号的,那么就执行符号扩展;如果它是char,那么不管它将要被转换成什么类型,都执行零扩展 :shock: 。
(2)互换内容
学C++或C的同志们,这里要小心了public class CleverSwap{
public static void main(String[] args){
int x = 1984; // (0x7c0)
int y = 2001; // (0x7d1)
x^= y^= x^= y;
System.out.println("x= " + x + "; y= " + y);
}
}
提示:Java语言规范描述到:操作符的操作数是从左向右求值的。
(3)Dos Equis
public class DosEquis{
public static void main(String[] args){
char x = 'X';
int i = 0;
System.out.println(true ? x : 0);
System.out.println(false ? i : x);
}
}
这里需要注意三元操作符的返回类型问题:
如果第二个和第三个操作数具有相同的类型,那么它就是条件表达式的类型。换句话说,你可以通过绕过混合类型的计算来避免大麻烦。
如果一个操作数的类型是T,T表示byte、short或char,而另一个操作数是一个int类型的常量表达式,它的值是可以用类型T表示的,那么条件表达式的类型就是T。
否则,将对操作数类型运用二进制数字提升,而条件表达式的类型就是第二个和第三个操作数被提升之后的类型。
(4)自己运行一下就知道了 :evil:
public class LastLaugh{
public static void main(String[] args){
char[] numbers = {'1', '2', '3'};
System.out.print("H"+"a");
System.out.print('H'+'a');
System.out.print("check out "+numbers);
System.out.print(numbers);
// \u0022 是双引号的Unicode转义字符
System.out.println("a\u0022.length()+\u0022b".length());
}
}
这么简单,没得提示!