数据类型的转换
|-- 自动类型转换
整型 和 浮点型 运算,整型会自动向浮点型转换
小类型和大类型进行运算时,小类型会自动的转换为大类型
char byte < short < int < long < float < double < String
如果是整数,默认转换的类型是int !!!
如果是浮点型,默认类型是double
|-- 强制类型转换
在java中,低类型可以自动向高类型转换,这就是上面的自动类型转换
如果需要高类型向低类型转换,java不允许自动完成转换,会报错!!
会损失精度
如果确实需要这个操作,可以进行强制类型转换
需要的类型 变量 = (需要的类型)值
课堂练习题:
提供了一个字符类型 char c = '中',要求求出"中"的unicode码
方案1:可以进行强制类型转换
(int)c
方案2:使用自动类型转换
c + 0
java、C语言、C++、C#这些语言都是强数据类型语言
值的类型是确定,也是不能随意改变的
python、PHP、JavaScript这些语言都是弱数据类型语言
类型可以随意变化
常见的运算符:
算术运算符:
就是数学中的四则运算
+
-
*
/ // 整除,只获取商的部分
% // 余数,求余,求模
关系(比较)运算符:
>
<
>=
<=
==
!=
关系运算符最终结果是一个boolean类型,表示是否成立!!
true:成立
false:不成立
逻辑运算符:
两个或者更多条件之间的关联关系
与(&& &):并且的意思
或(|| |):或者的意思
非(!):不是,取反的意思
&&和&的区别:
&&和||,叫做短路与(或)
如果前面的条件已经可以得到结果,则不会继续向后判断,效率较高
而单与(或),即便是已经得到结果,还是会继续完成所有判断,在返回结果
一般推荐使用&& 、 ||
自加和自减运算符
++ // 加1
-- // 减1
如 int a = 10
System.out.println(a++);
System.out.println(++a);
System.out.println(a--);
System.out.println(--a);
注意,对于++、-- 自家自减运算符而言,不管前还是后,对于变量本身而言
肯定要进行加1或者减1操作
注意2:在自加运算符中,前加加或者前减减优先级别非常高,仅次于括号
后加加和后减减的优先级别非常低,甚至比赋值符(=)还低
赋值运算符
= // 将右侧的值,最终赋值给左侧
+= // a += 10 <==> a = a + 10
-= // a -= 1 a = a - 1
*=
/=
%=
三目(木)运算符:
表达式 ? a : b
如:
int c = a < b ? 100: 1000
移位运算符:
是计算机底层进行的运算规则
& // 按位与
| // 按位或
^ // 异或
~ // 按位取反
<< // 左移运算
>> // 有符号右移
>>> // 无符号右移
计算机底层到底如何保存数据
计算机底层以二进制(数据的补码)进行数据保存和运算
bit(位):简写b,计算机中最小单位
byte(字节):简写B,计算机中基本单位
……
符号位:计算机为了描述数字的正负,而设计的位置,是二进制数据的最高位
如果最高位是0,则表示该数是正数
如果最高位是1,则表示该数是负数
问题:如果直接使用二进制进行计算,当引入了负数时,我们发现结果出现了错误
计算机为了解决这个问题,引入了如下三个概念:
原码:数据被转换为二进制后的数值 如-3: 1000 0011
反码:符号位不变,其余各位取反 1111 1100
补码:反码 + 1 1111 1101
正数的原码、反码、补码一致,或者说正数只有原码(三码合一)
计算机中所有数据都是基于补码进行运算和存储的!!!!
进制之间的转换问题:
10 --> 2进制
对十进制的数,进行除2,获取余数
2进制 --> 10进制
1010
个位*2^0 + 十位*2^1 + =
0 + 2 + 0 + 1 * 8 = 10
为什么要学习和掌握移位运算:
CPU的所有运算都是基于移位运算
移位的效率比其他运算符效率高
& // 按位与
| // 按位或
^ // 异或
~ // 按位取反
<< // 左移运算
>> // 有符号右移
>>> // 无符号右移
&: 两者为真,否则为真
|: 两者为假,否则为假
^: 相反为真,否则为假
~: 所有位,都进行取反,注意(和反码不一样)
<<: 二进制向左移动
>>: 有符号二进制向右移动,补符号位
>>>: 无符号二进制向右移动,补0
面试题:如果将2以效率最高的方式变成8
计算机中,常规情况下,移位效率最高,加减次之,乘除再次之
注意:现在计算机体系中,移位运算和加法运算效率差不多
int a = 10
int b = 11
a : 0000 1010
b :0000 1011
0000 1010
0000 1011
------------
0001 0101 // 21
十进制的数据进行运算的特点:逢十进一
二进制的数据进行运算的特点:逢二进一
byte a = 2
byte b = -3 1000 0011
short bb = -3 1000 0000 0000 0011
int bbb = -3 1000 0000 0000 0000 0000 0000 0000 0011
a + b = -1
0000 0010
1111 1101
----------
1111 1111
1111 1110
1000 0001 -1
10&11
0000 1010
0000 1011 &
------------
0000 1010 10
10 | 11
0000 1010
0000 1011 |
------------
0000 1011 11
10 ^ 11
0000 1010
0000 1011 ^
------------
0000 0001 1
~a
~0000 1010
1111 0101
1111 0100
1000 1011 -11
<<
10 << 2
0000 1010
移位运算的一些规则,在运算中的使用
1、&运算符
|-- 判断奇偶
num % 2 == 0
num & 1 == 0
|-- 判断一个数是否是2的幂次方
num & (num - 1)
2、异或运算
任何数和0异或,值不会发生变化
两个相同的值(同一个数),做异或,结果为0