目录
一、基础题练习
二、Java运算符
一、基础题练习
(1)第一题:
byte b1=10,b2=20,b;
b=b1+b2;
b=10+20;
哪句是编译失败的呢?为什么呢?
考点:
1)Java隐式类型转换
2)Java强转类型转换
3)变量相加和常量相加的区别
变量相加:要考虑这个两个变量的数据类型,
b =b1 +b2 ; b1和b2都是byte类型,当前参与运算,b1和b2先提升为int,结果应该int类型
而b是byte类型,无法接收int类型的结果,必须强制类型转换
常量相加:先相加,然后看计算结果是否在固定的类型范围内,在范围内就直接赋值了!
class DataTypeDemo2{
public static void main(String[] args){
//定义三个变量
byte b1 = 10,b2 = 20,b ;
//第一句话
// b=b1+b2 ;//不兼容的类型: 从int转换到byte可能会有损失
//需要强转
// b = (byte)(b1+b2) ;
//第二句话
b=10+20;
System.out.println("b的结果是:"+b) ;
}
}
(2)第二题:byte x = 129; 是否编译通过,结果是多少,计算过程;
byte类型的取值范围:-128~127
129已经超出范围,整数类型默认就是int,jvm在编译的时候通过不了,认为129应该int类型接收
而左边使用的byte类型,无法接收int类型,必须强转 !
class DataTypeDemo3{
public static void main(String[] args){
//定义一个变量x
//byte x = 129 ;//不兼容的类型: 从int转换到byte可能会有损失
//强转
byte x = (byte)129;
System.out.println(x) ;
}
}
129的原码 ----已经超出了byte类型的范围,jvm编译:整数默认int
00000000 00000000 00000000 10000001 ---原码,反码,补码都相同
计算机底层计算,使用补码进行计算
byte x = (byte)129; 强转
(00000000 00000000 00000000) 10000001 ---补码截取之后 10000001 一个字节的byte类型
截取之后的补码
最高符位 数值位
1 0000001
-1
--------------------------------------------------
1 0000000 反码
------------------------------------------------
1 1111111
- 64+32+16+8+4+2+1
= -127
求byte=300? 44
二、Java运算符
java 运算符的划分:
(1)算数运算符 + - * / %
注意:/在java中取整 java中在对小数计算会出现一点偏差(计算机是伪计算)
扩展的运算符++ --
A.单独使用:++/--在数据的前面/后面 ---->都是对当前数据的自增1/自减1
B.参与运算使用:
a:++/--在数据的前面 ----->先自增或自减,在参与运算
b:++/--在数据的后面------->先参与运算,再自己自增或自减
eg:int x=4;
int y=(X++)+(++x)+(x*10) 结果是70 将x=4赋给y y=4,x=5; ++x时x=5,自增1,x=6;6*10
(2)赋值运算符
A.基本赋值运算符:= ------>将等号右边的值赋给左边的变量
B.扩展赋值运算符:+=,-+,*=,/=,%=
eg:面试题
有一下代码,那一句代码会编译失败,为什么?
(A) short s=1;
s= s+1;
s 的值有问题吗?
有问题,s=s+1;java默认类型的提升,当 byte,char ,short 三者之间不转换,
一旦参与转换的话,首选会提升到int型
s= (short)(s+1);----->强制转换
System.out.println("s的值为:"+s);
(B) short s=1;
s+=1;
System.out.println("s的值为:"+s);
S+=1;等价于 (short)(s+1) ----->隐藏了强制类型的转换
没有问题
(3)比较运算符 < ,<=,> ,>=,==,!= ----->最终的结果为boolean ,要么true,要么false
(4)逻辑运算符(重点)
A.基本运算符:
逻辑单与& ---->并列关系,有false则false
逻辑单或| ----->或得关系,有真则真,假假为假
逻辑异或^ ------>相同则为false,不同则为true
逻辑非! ------>非true则false,偶数个非是它本身
B.扩展逻辑运算符
逻辑双与&&
逻辑单与和逻辑双与的区别:
同:都表示并列条件,有false 则false
异:逻双与&&连接的表达式,如果左边为false,则右边就不在执行,有短路的效果.执行的效果比较高
逻辑单与&,执行扥的效果比较低,左边表达式不成立的时候,右边的表达式仍要执行
逻辑双或||
连接的表达式左边的为true,则右边的表达式就不会执行了,具有短路的效果,有true则true
(5)位运算符
位运算符号:使用变量或者数值本身进行计算的
基本符号:
位与&:有0则0
位或|:有1则1
位异或^: 相同则为0,不同则为1
反码~: 在数据的补码基础上,全部按位取反0变1,1变0
(6)三元运算符
A:<<:左移
将<<符号左边的数据向左移动多少位,右边不够的补0,最高位丢弃掉
特点:将<<符号左边 的数据乘以2的移动次幂
eg: 3<<2 = 3 *2^2 = 12
B:>>:右移
将>>符号左边的数据向右移动多少位,
最高位是0,右移后,空缺位补0;最高位是1,最高位补1。
特点:使用>>左边数据除以2的移动次幂
eg: 24>>2 = 24/2^2 = 6
C:>>>:无符号右移
将>>>符号左边的数据进行向右移动,无论最高位是1还是0,都是补0
java 运算符的划分:
(1)算数运算符 + - * / %
注意:/在java中取整 java中在对小数计算会出现一点偏差(计算机是伪计算)
扩展的运算符++ --
A.单独使用:++/--在数据的前面/后面 ---->都是对当前数据的自增1/自减1
B.参与运算使用:
a:++/--在数据的前面 ----->先自增或自减,在参与运算
b:++/--在数据的后面------->先参与运算,再自己自增或自减
eg:int x=4;
int y=(X++)+(++x)+(x*10) 结果是70 将x=4赋给y y=4,x=5; ++x时x=5,自增1,x=6;6*10
(2)赋值运算符
A.基本赋值运算符:= ------>将等号右边的值赋给左边的变量
B.扩展赋值运算符:+=,-+,*=,/=,%=
eg:面试题
有一下代码,那一句代码会编译失败,为什么?
(A) short s=1;
s= s+1;
s 的值有问题吗?
有问题,s=s+1;java默认类型的提升,当 byte,char ,short 三者之间不转换,
一旦参与转换的话,首选会提升到int型
s= (short)(s+1);----->强制转换
System.out.println("s的值为:"+s);
(B) short s=1;
s+=1;
System.out.println("s的值为:"+s);
S+=1;等价于 (short)(s+1) ----->隐藏了强制类型的转换
没有问题
(3)比较运算符 < ,<=,> ,>=,==,!= ----->最终的结果为boolean ,要么true,要么false
(4)逻辑运算符(重点)
A.基本运算符:
逻辑单与& ---->并列关系,有false则false
逻辑单或| ----->或得关系,有真则真,假假为假
逻辑异或^ ------>相同则为false,不同则为true
逻辑非! ------>非true则false,偶数个非是它本身
B.扩展逻辑运算符
逻辑双与&&
逻辑单与和逻辑双与的区别:
同:都表示并列条件,有false 则false
异:逻双与&&连接的表达式,如果左边为false,则右边就不在执行,有短路的效果.执行的效果比较高
逻辑单与&,执行扥的效果比较低,左边表达式不成立的时候,右边的表达式仍要执行
逻辑双或||
连接的表达式左边的为true,则右边的表达式就不会执行了,具有短路的效果,有true则true
(5)位运算符
位运算符号:使用变量或者数值本身进行计算的
基本符号:
位与&:有0则0
位或|:有1则1
位异或^: 相同则为0,不同则为1
反码~: 在数据的补码基础上,全部按位取反0变1,1变0
(6)三元运算符
A:<<:左移
将<<符号左边的数据向左移动多少位,右边不够的补0,最高位丢弃掉
特点:将<<符号左边 的数据乘以2的移动次幂
eg: 3<<2 = 3 *2^2 = 12
B:>>:右移
将>>符号左边的数据向右移动多少位,
最高位是0,右移后,空缺位补0;最高位是1,最高位补1。
特点:使用>>左边数据除以2的移动次幂
eg: 24>>2 = 24/2^2 = 6
C:>>>:无符号右移
将>>>符号左边的数据进行向右移动,无论最高位是1还是0,都是补0
少年的肩应该担起草长莺飞和明月清风。



