一、算术运算
1.计算式有小数参与
//如果计算时有小数参与
System.out.println(1.1 + 1.01);//2.1100000000000003
System.out.println(1.1 - 1.01);//0.09000000000000008
System.out.println(1.1 * 2);//2.2
//在代码中,如果有小数参与计算,结果可能不精确
//为什么呢????????
//嘿嘿!以后再说
2.转换
(1)分类
<1>隐私转换(自动类型提升)
小范围自动转为大范围
byte—>short—>int—>long—>float—>double
<2>强制转换
如果要把一个取值范围大的数据或者变量赋值给另一个取值范围小的变量。是不允许直接操作。
如果一定要这么干,就需要加入强制转换。
目标数据类型 变量名 = (目标数据类型)被强转的数据;
(2)两种提升规则
- 取值范围小的,和取值范围大的进行运算,小的会先提升为大的,再进行运算。
- byte、short、char三种类型的数据在运算的时候,都会直接先提升为int,然后再进行运算。
- char怎么转???—>嘿嘿黑!!!
(3)一些举例
<1>byte类型的计算
byte a = 1,byte b = 2;
byte c = (byte)a + b;
//这样写会报错
//前面讲过,byte类型在计算时会先转为int型,所以(byte)a + b,是两种不同类型数据进行相加
//正确写法如下:
byte = (byte)(a + b);//a+b的计算结果位int型,将其强制转化为byte型!!!
<2>字符串
当”+“操作中出现字符串,这个”+“是字符串连接符,它会将前后的数据进行拼接,产生一个新的字符串!!!
"123" + 123 ------>"123123"
连续加时,从左到右逐个执行
1 + 99 + "年" 结果--->100年
另一种连续加
System.out.println(1 + 2 + "abc" + 2 + 1);//结果:3abc21
原因:从左到右逐个相加,3和字符串abc做拼接操作产生新的字符串”3adc“,新的字符串和2进行拼接操作,同理新字符串”3abc2“与1进行拼接操作。
二、自增运算符
++、–
三、赋值运算符
=
注意:java里的”等于“用”==“表示
四、扩展赋值运算符
+=、-=、*=、/=、%=
1.运算规则
就是把左边跟右边进行运算,把最终的结果赋值给左边,对右边没有任何影响。
2.注意点
扩展的赋值运算符中隐层还包含了一个强制转换。
以+=为例。
a += b ;实际上相当于 a = (byte)(a + b);
五、关系运算符
==、>=、<=、!=、>、<
注意点:关系运算符最终的结果一定是布尔类型的。要么是true,要么是false
六、逻辑运算符
&(逻辑与):两边都为真,结果才是真,只要有一个为假,那么结果就是假。
|(逻辑或):两边都为假,结果才是假,只要有一个为真,那么结果就是真。
^(异或)的使用:如果两边相同,结果为false,如果两边不同,结果为true
!(取反)的使用:false取反就是true,true取反就是false
七、短路逻辑运算符
&&:
运算结果跟&是一模一样的,只不过具有短路效果。
||:
运算结果跟|是一模一样的。只不过具有短路效果。
八、三元运算符
需求:定义一个变量记录两个整数的较大值(根据判断得到不同的结果)
格式:
关系表达式 ? 表达式1 :表达式2 ;
最终的结果一定要用,否则会报错!
九、运算符的优先级
小括号优于所有------>养成加小括号的习惯!!!
十、原码、反码、补码
1.原码
(1)最左边是符号位,0为正,1为负
(2)最大的数(一个字节)0111 1111 , 最小值 1111 11111
(3)弊端:负数计算,结果出错
2.反码
(1)目标
为解决原码不能计算负数的问题而出现
(2)计算规则
正数反码不变,负数的反码在原码的基础上,符号位不变,数值取反,0变1,1变0
(3)弊端
当计算跨0时,会出现错误,因为0的反码有两种表现形式,即0000 0000 和 1111 1111
3.补码
1000 0000 指-128
计算机的数据存储和计算都是以补码的形式进行的
(1)目的
为解决负数计算时跨0的问题
(2)计算规则
正数的补码不变,负数的补码在反码的基础上+1
补码多记录一个特殊的值-128,该数据在一个字节下,没有原码和反码
4.隐式转换
public class Test{
public static void main(Stirng[] args){
byte a = 10;//0000 1010
int b = a;//0000 0000 0000 0000 0000 0000 0000 1010
System.out.println(b);//前面补0,补够比特位
}
}
5.强制转换
public class Test{
public static void main(Stirng[] args){
int a = 300; //0000 0000 0000 0000 0000 0001 0010 1100
byte b =(byte)a;//300超过了byte的取值范围 四个字节转成一个字节 0010 1100 --->44
System.out.println(b);//输出结果44
}
}
十一、其他运算符
“<<”:左移,低位补0(左移一次,原数基础上乘以2)
“>>”:右移,高位补0或1,符号位与原来的符号一样,数字位补0(右移一次,相当于除2)
“>>>”:无符号右移,高位补0