java解惑(谜题5到10)

谜题5:多重转换
System.out.println((int)(char)(byte)-1);  //65535
java使用了基于2的补码的二进制运算,因此int型的-1的所有32位均置位的。int到byte转换,是窄化原生类型转换(narrowing primitive conversion),直接将除低8位以外的所有位全部砍掉。保留的是8位的byte,仍旧表示-1。byte到char并不是一个拓宽原生型转换,byte是有符号,而char是无符号,而是一个拓宽并窄化原生类型的转换(widening and narrowing primitive conversion): byte到int,int到char
总之,窄的整型转换成较宽的整型时符号扩展规则: 如果最初的数值类型是有符号的,那么就执行符号扩展(即如果符号位为1,则扩展为1,如果为零,则扩展为0);如果它是char,那么不管它将要被提升成什么类型,都执行零扩展。

当byte转char时是符号扩展,所有的16位值为1,即65535,从char到int是无符号扩展。
谜题7:互换内容
int x = 1984;
		int y = 2001;
		x ^= y ^= x ^= y;
		
		System.out.println("x=" + x + "y=" + y); //x=0;y=1984

//交换x与y,不推荐使用,推荐用temp
	    x^=y;
		y^=x;
		x^=y;

谜题8:Dos Equis
char x = 'X';
		int i = 0;
		System.out.println(true ? x : 0);// X
		System.out.println(false ? i : x);// 88

条件表达式结果类型的规则:
(1) 如果第二个和第三个操作数具有相同的类型,那么它就是条件表达式的类型。
(2) 如果一个操作的类型是T,T表示byte、short或char,而另一个操作数是一个int类型的“字面常量”,并且它的值可以用类型T表示,那条件表达式的类型就是T。
(3) 否则,将对操作数类型进行提升,而条件表达式的类型就是第二个和第三个操作被提升之后的类型。
条件表达式的类型将确定调用哪一个重载的print方法。对于第一个表达式,将调用PrintStream.print(char),而第二个将PrintStream.print(int)
最好在条件表达式中使用类型相同的第二和第三操作数。
谜题9:半斤
short x = 0;
		int i = 123456;
		x += i;
		System.out.println(x);// -7616

		x = x + i; // 编译不通过,
Java语言规范中提到:复合赋值 E1 op= E2等价于简单赋值 E1 = (T)((E1) op (E2)),其中T是E1的类型。

复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型。
请不要将复合赋值操作符作用于byte、short或char类型的变量;在将复合赋值操作符作用于int类型的变量时,要确保表达式右侧不是long、float或double类型;在将复合赋值操作符作用于float类型的变量时,要确保表达式右侧不是double类型。其实一句: 不要将让左侧的类型窄于右侧的数字类型。
谜题10:八两
Object x = "Buy";
		String i = "Effective java";
		
		x = x+i;
		System.out.println(x);
//		x+=i;   //编译出错
复合赋值操作符要求两个操作数都是原生类型的,例如int,或包装了的原生类型,如Integer,如果在+=操作符左侧的操作数是String类型的,那么它允许右侧操作数是任意类型,执行的是字符串连接操作。

你可能感兴趣的:(java,dos)