Java解惑-3

前文再继, 书接上一回:
疑惑从这里来, 答案自己想。

(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());
}
}
这么简单,没得提示!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值