运算符和表达式
![](https://i-blog.csdnimg.cn/blog_migrate/1516d18059cb0ac3c5f31ec7dd321886.png)
算数运算符
![](https://i-blog.csdnimg.cn/blog_migrate/08aa47321dd0ca05a742a2d30d64d0ae.png)
小数运算
代码中,如果有小数参与运算,结果可能不准确。
![](https://i-blog.csdnimg.cn/blog_migrate/c421ee89cb46f6b9786f8a6120dcccd9.png)
除,取余,取模
除法
public static void main(String[] args) {
System.out.println(10/3); //3
System.out.println(10/2); //5
System.out.println(10.0/3); //3.3333333333333335
}
结论:
整数之间的除法结果只能得到整数(向下取整)。
小数参与计算,结果可能不精确,如果想要精确计算,则需要用到后面的知识点。
取余
取余运算其实和除法运算一样,只不过除法运算得到的是整数,取余运算得到的是余数。
public static void main(String[] args) {
System.out.println(10%3); //1
System.out.println(10%2); //0
System.out.println(10.0%3); //1.0
}
注意:浮点数参与取余运算,得到的结果还是浮点数。
+
![](https://i-blog.csdnimg.cn/blog_migrate/b18c9c57571f1f9d534ef3b99a0dc873.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8968c9196f02ca860ee20a806ced00c5.png)
那么如何转换呢?
首先介绍java两种数据类型转换形式,隐式转换和强制转换。
![](https://i-blog.csdnimg.cn/blog_migrate/f33fdd1dd1c8d009e14413218c6e78d9.png)
隐式转换
![](https://i-blog.csdnimg.cn/blog_migrate/e74e8e3abe289c2371758f6efd815d4b.png)
变量b就为10.0
![](https://i-blog.csdnimg.cn/blog_migrate/37c9ed364da7112bbbc73505b077fe63.png)
第一种情况c为double类型,第二种情况c为int类型。
![](https://i-blog.csdnimg.cn/blog_migrate/2e89ffcb9e35babd6a169ad52e9f302b.png)
练习
![](https://i-blog.csdnimg.cn/blog_migrate/1bd1eb342bf223f3874f009579fc694d.png)
强制转换
![](https://i-blog.csdnimg.cn/blog_migrate/31be0ea079d8faa13c1c34c8f0f04dea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6ed97f0a128ec2a235e005a180a921a7.png)
上图示例300超过byte取值范围,300-127-128-1 = 44。可以抽象理解为环形。
public static void main(String[] args) {
int a = 300;
byte b = (byte)a;
System.out.println(b); //44
}
字符串拼接
![](https://i-blog.csdnimg.cn/blog_migrate/ddece5292e70d4a20ccbbb3189bb7308.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f550f43f77806b549c61dafe7729eeda.png)
练习
![](https://i-blog.csdnimg.cn/blog_migrate/98de7115694ed9311ff4a150de80ffe0.png)
字符相加
![](https://i-blog.csdnimg.cn/blog_migrate/3f90a5617bb2860180e3db10375db5eb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fc5ea8eb2192d5ca904252924908e748.png)
注意字符加字符串就是字符串拼接。
![](https://i-blog.csdnimg.cn/blog_migrate/cce60faa56dbc94b3a8b16f7bb9806e1.png)
public static void main(String[] args) {
System.out.println('a'+'b'); //195
System.out.println('a'+0);//97
System.out.println('a'+"bcd");//abcd
}
自增自减运算符
![](https://i-blog.csdnimg.cn/blog_migrate/3b3b51a39b0b1003be8f4e41ee7fdae1.png)
自增自减运算符可以真实改变变量值。
![](https://i-blog.csdnimg.cn/blog_migrate/2b70cb47766565f113c2199aace3a871.png)
![](https://i-blog.csdnimg.cn/blog_migrate/af5fed1a5b20f53b11f38eef5956db81.png)
赋值运算符
![](https://i-blog.csdnimg.cn/blog_migrate/c3127bbbb5482e0ff1d57bc68fb7bfed.png)
细节:
![](https://i-blog.csdnimg.cn/blog_migrate/203c3447d87d9235771b7b3f2f491318.png)
关系运算符
![](https://i-blog.csdnimg.cn/blog_migrate/346c44f58ca9e0c26a6571cc0750cd73.png)
注意关系运算符得到的结果都是boolean类型的,只能为true或者false。
逻辑运算符
![](https://i-blog.csdnimg.cn/blog_migrate/835a575ff81de4f75f2bb8f71552c6de.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e4a1a460c9ed120a5b74f7118e6924d7.png)
短路逻辑运算符
![](https://i-blog.csdnimg.cn/blog_migrate/80c1b57e350e4ddceda26d2c5916a47d.png)
相当于对传统逻辑运算符进行优化,避免一些不必要的操作。
![](https://i-blog.csdnimg.cn/blog_migrate/79f590c567dd2654b1a92954867d6c95.png)
注意一下题目
![](https://i-blog.csdnimg.cn/blog_migrate/1e5cd64cf65df3554129fa672c37a64b.png)
三元运算符
![](https://i-blog.csdnimg.cn/blog_migrate/ba6fe5835aa39151768d43c24b022318.png)
练习
![](https://i-blog.csdnimg.cn/blog_migrate/b39c5038ecc39da29fa88527cd209b0b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8a636e15af15013e5bd1e99bab90d0b0.png)
运算符优先级
![](https://i-blog.csdnimg.cn/blog_migrate/f4a4b43cea2cc82ac1b9aef8b9db7b18.png)
其他运算符
![](https://i-blog.csdnimg.cn/blog_migrate/491fb27ad883feb2c4f9ca99c86185b4.png)
原码补码反码
![](https://i-blog.csdnimg.cn/blog_migrate/17dfc9ea0037c485d1aa0acd868eeb3e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/62cecb33c3c04a6b8ce39f3ca03cc1ee.png)
看一下0加1
![](https://i-blog.csdnimg.cn/blog_migrate/ffa8d5f5d2c70d93f7281ca4c5a903d0.png)
结合数轴来理解,最高位决定方向,所以这是原码用负数进行计算,就会出现结果与实际正确结果相反的。
然后出现了反码。
![](https://i-blog.csdnimg.cn/blog_migrate/0e19a536196211fe69144378b69477be.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e7b38f07b37ee5153bc1124c5f7363a6.png)
现在验证一下-56加上1是否为-55。
上图-56的反码加1之后为11001000。而-55的原码为10110111,取反码为11001000,所以
可以证得,-56的反码加1之后,再取反码,就得到正确答案。
但是反码进行加法运算再由负数变为整数的时候,会出现1的误差。
![](https://i-blog.csdnimg.cn/blog_migrate/ae534e5be5afd8f6fb2d5c1d619c8a5f.png)
出现问题的根本原因在于出现了-0和+0,-0的反码加上1之后变为了00000000,而正数的反码是他本身,所以还是0。(出现+0和-0的根本原因在于规定了最高位为符号位)
所以反码中0有两种表达方式是根本原因,那么解决起来也是很简单,反码加上1不就行了。所以出现了补码。
![](https://i-blog.csdnimg.cn/blog_migrate/1d2c592663428a15b290a6bcdeadc871.png)
再补码中0有了惟一的表达方式。正数的补码是它本身,负数的补码是反码加1。
再看看-128
![](https://i-blog.csdnimg.cn/blog_migrate/13f654646d669eb64d7f54fa34080b4b.png)
-128没有原码,所以自然也就没有反码,但是补码是再反码基础上加1,这样就没有两个0了(-0和+0),可以 从上图看到+0和-0的补码都为00000000,那么就多出了一组补码,所以-128就没有原码和反码,而有补码。所以,计算机中规定补码为10000000代表-128。这也就是为什么计算机中一个字节的范围为-128到+127。计算机中数据的存储和计算都是以补码形式进行的。
总结
![](https://i-blog.csdnimg.cn/blog_migrate/596454c7e3d12be2b2fe888be54feade.png)
![](https://i-blog.csdnimg.cn/blog_migrate/41620fac2d7ee6272f023675e71a9287.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ecffc96b95aab885165b5b0499bcff26.png)
![](https://i-blog.csdnimg.cn/blog_migrate/092610ada09836ed3baa3a1e6cb44abd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/44d3d7d84995c10545a90f102b64827c.png)
隐式转换就直接在前面补0。
![](https://i-blog.csdnimg.cn/blog_migrate/3db1e56bd3e9a4cf4ab19082c0fe9395.png)
强制转换就是将前面多余的截掉。
![](https://i-blog.csdnimg.cn/blog_migrate/9175f8d8246e06641b8cb7ba07cf443d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/54f50e1c03516e9642fdd9f8f0115ebd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4a1c2af6cf7bd40ebe64284a0d718a9e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4f05c9507d2447ae55e1c70226d066af.png)
注意上面的是正数的情况,如果为-200,像左移动两位,结果为-800。
![](https://i-blog.csdnimg.cn/blog_migrate/9b68f7707be53edb514232693fde2418.png)
右移一次就相当于除2。注意不会改变符号位,如果上面为-200,向又移动两位为-50。
无符号右移
不管是正数还是负数,补的都是0。