Java SE - 语言基础 - 2

数据类型转换


1. 隐式转换

从低级类型向高级类型的转换,系统自动执行,亦称为自动转换。

byte < short <int < long <float <double

long8bytefloat4byte,但long64bit二进制直接转换为十进制,至多表示约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");
     }
}

image.png

 

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类型,这里易犯错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值