运算符
1.运算符是对字面量或者变量操作的符号(+-*/)。
2.表达式:用运算符把字面量或者变量连接起来,符合Java语法的式子就可以称为表达式(A+B)。
3.运算符分类
- 算数运算符
- 自增运算符
- 赋值运算符
- 关系运算符
- 逻辑运算符
- 三元运算符
算数运算符
1.基本运算(同类型数值运算):+ - * / %(取模) 注意,在代码中,如果有小数参与计算,结果有可能是不精确的。
2.高级运算:数值进行运算时,需要数据类型转成一样的才能进行运算。转换方式有两种。
- 隐式转换(自动类型提升):取值范围小的数值转换为取值范围大的数值。当不同类型的数据进行运算或者赋值时,系统会自动进行隐式转换(不需要写额外代码)。
规则:1.取值范围小的和取值范围大的进行运算,小的会先提升为大的,再进行运算。
2.byte、short、char三种类型的数据在运算的时候,都会直接先提升为int,再进行运算。
- 强制转换:取值范围大的数值转换为取值范围小的数值。如果要进行强制转换就需要书写代码。强制转换有可能会导致数值发生错误(超过取值范围)。
格式:目标数据类型 变量名 = (目标数据类型) 被强转的数据;
double a = 12.3;
int b = (int) a;
- 字符串的"+"操作:当"+"操作中(只要)出现字符串时,这个"+"是字符串连接符,而不是算术运算符了。会将前后的数据进行拼接,并产生一个新的字符串。连续进行"+"操作时,从左往右逐个执行。
String a = "123";
int b = 123;
System.out.println(a + b);
//输出结果
123123
- 字符相加:前面说过char、short、byte运算时会先转换成int,若是运算表达式中出现字符,且表达式中没有出现字符串(说明字符串出现时优先字符串拼接),那么会将字符转化成ASCII码中对应的数字,再进行运算。
赋值运算符
1.= -= += *= /= %=,在赋值运算符中隐含了强制类型转换,如下例
short s = 1;
s += 1; //此时s等于2,但是s仍然是short类型,因为隐含了强制类型转换 s = (short)(s + 1);
关系运算符
1.== != > >= < <=,关系运算符的结果都是boolean类型,要么是true,要么是false。
逻辑运算符
1.非短路逻辑运算符:& | ^(异或) !,非短路逻辑运算符会判断完所有的条件再去得到逻辑表达式的真假 。
2.短路逻辑运算符:&& ||。短路逻辑运算符&&只需要在第一个条件不满足时就可以不用判断第二个条件(不参与运行),结果就为假,短路逻辑运算符||只需要满足了第一个条件时就可以不用判断第二个条件(不参与运行),结果就为真,那么短路逻辑运算符可以有效提高程序运行效率。
三元运算符
1.格式:关系表达式?表达式1:表达式2
2.规则:关系表达式的结果为真,运行表达式1,关系表达式的结果为假,运行表达式2。
int a = 10;
int b = 100;
System.out.println(a>b?a:b);
//输出结果
100
运算符的优先级
1.运算符都是有优先级的,比如说 a + b * c,就会先进行乘的运算,再进行加的运算,但是不需要完全背下运算符优先级的表,只需要在进行运算的时候加上小括号,方便阅读同时不会出错。
原码补码反码
1.一个位为一个bit(比特),一个字节(byte)为8个bit,如 00111000 ,一个0/1就是一个bit,八个0/1就是一个字节。
原码
1.原码:十进制数的二进制表现形式,最左边时符号位,0为正,1为负。
2.原码的弊端:利用原码对整正数进行计算不会有问题,但是如果是负数计算,结果就会出错(比如负数 10000001 + 1 ,我们希望得到的正确结果是0,但是实际却是 10000010 ,也就是-2)。
反码
1.反码:正数的反码是其本身,负数的反码是符号位保持不变,其余位取反。
2.反码是为了解决原码不能计算负数的问题而出现的。
3.反码的计算:将负数原码取反后进行运算,运算完后再取反,得到目的结果的原码。
4.反码的弊端:反码中的0有两种形式 11111111(-0),00000000(+0),因此在负数加上一个正数时,若是结果为正数,那么就会有1的偏差,若是结果为0,无法判断是否偏差,若是结果为负数,那么结果是正确的。
补码
1.补码:正数的补码是其本身,负数的补码是在其反码的基础上+1。
2.补码的出现是为了解决反码的有两个0的表现形式的弊端。
3.负数的补码是在其反码的基础上+1这一步使得其错开了一位,将反码中0的两种表现形式给屏蔽掉了,因此在补码中,0只有一种表现形式(00000000)。
4.补码中的-128为10000000,一个字节下反码和原码都无法表示-128,由于补码的这个特性,一个byte的取值范围为-128-127。
5.计算机中的存储和计算都是以补码的形式进行的。
数据类型转换原理
1.隐式转换:byte 1个字节,short 2个字节,int 4个字节,long 8个字节,因此隐式转换是在取值范围较低的类型中的二进制表现形式上补足够的0。比如说 byte 类型的0000 0001,转换为short类型时,就是 0000 0000 0000 0001。
2.强制转换:强制转换也是同理,将要转换数据的类型补足/缩短存储长度到目标数据类型的存储长度,比如 short 类型的 0000 0000 1000 1100 (十进制数140)转换为byte时,会保留后面8位1000 1100(十进制数-12,符号位为1)。