数据类型转换
1. 隐式转换
从低级类型向高级类型的转换,系统自动执行,亦称为自动转换。
byte < short <int < long <float <double
long为8byte,float为4byte,但long为64bit二进制直接转换为十进制,至多表示约9*10^18大小的数
而float为浮点示数,可表值比long更大,但并不精确。
2. 显示转换
强制类型转换,可能会导致精度丢失产生或大或小的问题。
//精度丢失引发的错误示例
doubleresult=60/100;
System.out.println("result:"+result);
-->result: 0
doubleresult=60/100.0;
System.out.println("result:"+result);
-->result: 0.6
运算符
1. 赋值运算符
"="
2. 算数运算符
"+" "-" "*" "/" "%"
"+"和 "-" 可以作为数据的正负符号
"+"运算符可以拼接字符串
0 不能作为被除数
3. 自增、自减
"a++" "++a" "a--" "--a"
前置的自增、自减会先将变量的值执行自增/自减再让该变量参与表达式的运算
后置的自增、自减会先让变量参与表达式的计算再执行自增/自减
4. 关系运算符
"==" "<" ">" "<=" ">=" "!="
5. 逻辑运算符
"&&" "||" "!"
逻辑运算符"&&" "||"存在着短路效果:
如果"&&"前面为假,则不会执行判断"&&"后面的逻辑式
如果"||"前面为真,则不会执行"||"后面的逻辑
//测试短路现象:
publicclass Test {
public static voidmain(String[] args) {
inta=1;
System.out.println(a<0&&a/0==0?"程序崩溃":"不会检查执行a/0");
}
}
6. 位运算符
6.1 位逻辑运算符
"&" "|" "~" "^"
将会在学习后于其他文章中详解
6.2 位移运算符
"<<" ">>" ">>>"
左移 "<<" 是将一个二进制操作数对象按指定的移动位数向左移, 左边(高位端)溢出的位数被丢弃, 右边(低位端)的空位用0补充, 如果左移值为一, 即代表着符号位被丢弃, 符号位右一位填补原符号位位置
左移带来的结果是所有二进制位向左进一, 若原符号位与新符号位相同, 则左移相当于乘以2的幂
3 << 2
转换:0000 0000 0000 0000 0000 0000 0000 0011运算:0000 0000 0000 0000 0000 0000 0000 1100
结果:12
public static void main(String[] args) {
int[] a=new int[] {0,-1,1,2,10,100,-100,2147483647,-2147483647,2000000000};
System.out.println("----------Before----------\n");
for(int x:a)
System.out.print(x+"\t");
for(int i=0;i<10;i++)
a[i]<<=1; //执行位移运算
System.out.println("\n----------After----------\n");
for(int x:a)
System.out.print(x+"\t");
}
结论:
在不影响符号位的位移运算中, 左位移表示的是原变量乘以2的幂, 而影响符号位后, 则可能出现无法控制的情况
右移 ">>" 是将一个二进制的数按指定的位数向右移动, 右边(低位端)溢出的位被丢弃, 左边(高位端)用符号位填补, 正数的符号位为0, 负数的符号位为1, 故右移相当于除以2的幂, 遇到奇数右移将会产生预期结果偏差
无符号右移 ">>>" 同样将一个数转换为二进制后按指定的位数向右移动, 右边(低位端)溢出的位被丢弃, 左边(高位端)一律用0填补, 故无符号右移会将所有的数变为正数, 且相当于除以2的幂, 仍会产生预期结果偏差
-11>>1
-11的byte型变量二进制形式为:1111 0101(补码),系统会先将数据转换为int
转换:1111 1111 1111 1111 1111 1111 1111 0101
运算:1111 1111 1111 1111 1111 1111 1111 1010
结果:-6
-32766>>>1 = 2147467265
转换:1111 1111 1111 1111 1000 0000 0000 0010
运算:0111 1111 1111 1111 1100 0000 0000 0001
结果:2147467265
当左操作数是short、byte、char类型时,移位前会将自身转化为int中相对应的值,所以移位后所得到的数据为int类型,这里易犯错。