数据计算的引入
数据类型
1、java中基本数据类型之间存在自动类型转换
当遇到byte,short,char这三种数据类型的变量参与运算的时候,会首先将数据类型提升为int类型,再参与运算
byte,short,char -> int -> long -> float -> double
2、强制类型转换
目标数据类型 变量名 = (目标数据类型)(要转的表达式)
注意:强制类型转换,一般不推荐使用,因为可能会造成精度损失
` public static void main(String[] args) {
//有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢?
//不能直接将130赋值给byte类型的变量b,130大于byte类型可接受的最大范围
byte b = (byte)130;
System.out.println(b);
byte b2 = (byte)300; //44
System.out.println(b2);
}
}
/*
130的原码,反码,补码:00000000 00000000 00000000 10000010
强制类型转换之后:10000010
符号位 数值位
补码: 1 0000010
反码: 1 0000001
原码: 1 1111110
----------------------
数值位转10进制:64+32+16+8+4+2 = 126
最高位是1,最终答案是-126
关系运算符:
> >= < <= != ==
注意:关系表达式最终结果一定是boolean类型
++
单独使用的时候,无论++放在变量的前面或者后面,变量值都是自加1
组合使用的时候,++放在后面,先进行赋值运算,再进行自加1;++放在前面,先进行自加1,然后再进行赋值运算。
单独使用的时候,无论--放在变量的前面或者后面,变量值都是自减1
组合使用的时候,--放在后面,先进行赋值运算,再进行自减1;--放在前面,先进行自减1,然后再进行赋值运算。
三目运算符:(关系表达式)?表达式1:表达式2;
运行流程:
1、先计算关系表达式的结果,无论关系表达式的式子多么复杂,结果一定是boolean类型的
2、当关系表达式的结果为true的时候,执行表达式1
3、当关系表达式的结果为false的时候,执行表达式2
注意:
1、表达式1或者表达式2,只会选择其中一个执行
2、三目运算符,整体是要有一个结果的,表达式1或者表达式2都不能是一个没有结果的表达式
位运算符:针对二进制的值补码形式进行计算的
& | ^ ~ << >> >>>
` public static void main(String[] args) {
byte a1 = 3;
byte b1 = 4;
System.out.println(a1 & b1);
System.out.println(a1 | b1);
System.out.println(a1 ^ b1);
System.out.println(~ b1);
}
}`
数学计算过程: 计算机中所有数据的运算都是采用补码的形式进行的
3的补码:00000011
4的补码:00000100
&运算 有0则0
00000011
&
00000100
--------------
00000000 => 0
|运算 有1则1
00000011
|
00000100
--------------
00000111 => 7
^运算 相同则0,不同则1
00000011
^
00000100
--------------
00000111 => 7
~运算 1变成0,0变成1
~ 00000100
--------------
补码 11111011
反码 11111010
原码 10000101
=> -5
<< : 左移,右边用0补齐,相当于乘上2的n次方
>>: 右移,左边空出来的,看最高位是1还是0,若是1就用1补齐,若是0就用0补齐,相当于除上2的n次方
>>>: 无符号右移,左边空出来的,无论最高位是0还是1,都用0补齐
`public static void main(String[] args) {
byte b1 = 5;
System.out.println(b1<<2); // 20 = 54 = 52^2
System.out.println(b1<<3); // 5*2^3 = 40
System.out.println(b1<<5);
System.out.println(24>>2); // 6=24/4=24/2^2
System.out.println(-24>>2); // 6=-24/4=-24/2^2
System.out.println(-24>>>2); //
}`
b1的补码:00000101
<<2位:
00000101
(00)00010100 -> 20
-----------
24的补码:00011000
24>>2位:
00011000
00000110(00)
----------- -> 6
-24的原码:10011000
-24的反码:11100111
-24的补码:11101000
-24>>2:
11101000
补码: 11111010(00)
------------------------
已知补码求原码:
补码: 11111010
反码: 11111001
原码: 10000110
---------------- -> -6
-24的原码:10000000 00000000 0000000 00011000
-24的反码:11111111 11111111 1111111 11100111
-24的补码:11111111 11111111 1111111 11101000
-24>>>2:
11111111 11111111 1111111 11101000
0011111111 11111111 1111111 111010(00)
--------------------------------------- -> 1073741818