--(1) boolean类型不能转换为其他类型
注:无论是复杂的比较运算符操作还是简单的,其结果都是boolean类型。如果强制将其他类型赋值给boolean类型,编译器报错(与c是不同的)
--(2) 在定义long或者float类型时,需要加后缀L或者f(整数默认是int型,浮点数默认是double型)
--(3) byte,short在定义的时候,他们接受的其实是一个int型
**--(4) java中的char类型占用两个字节,与c/c++中的单字节不同,所以char型可以赋值一个中文汉字(java语言采用的是UNICODE编码,兼容了ASCII编码)
**--(5) 扩展赋值运算符其实隐含了一个强制类型转换
举例: s += 1; //等价于 s = (s的数据类型)(s + 1);
--(6) 逻辑运算符 && || !^ 跟c语言用法相同; 但是 & ^ | ~ (按位取反运算符)即使逻辑运算符又是位运算符,当操作数是boolean型时,为逻辑运算符。
注:举一个按位取反运算符的例子(该运算符容易出错,原因在于取反后为负值时,需考虑到原反补码情况)
System.out.println(~3); //out: -4
分析: 3的二进制:00000000 00000000 00000000 00000011
按位取反后:11111111 11111111 11111111 11111100 (补码)要想计算得到输出值:转换为反码,又转换为补码
反码:11111111 11111111 11111111 11111011
补码:10000000 00000000 00000000 00000100 //-4
**--(7) 异或的性质:恒等律: x ^ 0 = 0; 归零律:x ^ x = 0 (参考http://lijinma.com/blog/2014/05/29/amazing-xor/ 引用该博主内容)
注:异或的实际应用:
static inline int ipv6_addr_equal(const struct in6_addr *a1, const struct in6_addr *a2) { return (((a1->s6_addr32[0] ^ a2->s6_addr32[0]) | (a1->s6_addr32[1] ^ a2->s6_addr32[1]) | (a1->s6_addr32[2] ^ a2->s6_addr32[2]) | (a1->s6_addr32[3] ^ a2->s6_addr32[3])) == 0); }
来使某些特定的位翻转,因为不管是0或者是1与1做异或将得到原值的相反值;
举例:将变量b的第6位翻转
int a, b;
int mask = 1 << 6;
a = 0xb1;
b = a ^ mask;
5. 经典题目:不使用其他空间,交换两个值
举例:
a = a ^ b;
b = b ^ a;
a = a ^ b;
1. byte,short,char --> int -->long --> float --> double;(如果表达式中存在高类型,低类型全部转换为高类型)
注:long(8byte) --> float(4byte) 不会存在精度丢失问题,因为在底层存储结构不同,float表示的数据范围比long的范围要大。
2. byte,short,char互相之间不转换,他们参与运算首先转换为int类型;(如果表达式中全部是这三者,类型提升,全部转换为int类型)
3. 整数默认是int型,浮点数默认是double型
注意数据精度的丢失
--(1) 字符串数据和其他数据做+运算,结果是字符串类型,这里的+不是算术运算符+,而是字符连接符+
举例:
System.out.println("hello"+‘a‘+1); //out: helloa1
System.out.println(‘a‘ + 1 + "hello"); //out: 98hello
System.out.println("5+5 = " + 5 + 5); //out: 5+5 = 55
System.out.println(5 + 5 + "=5+5"); //out: 10=5+5
原文:https://www.cnblogs.com/gogotao/p/10872789.html