目录
运算符:
转换:
隐式转换:
小范围数据可以直接可以给大范围数据:
这里做了一张图范围向下兼容表编辑
运算时,数据范围小的和数据范围大的,需要讲运算范围小的提升为运算范围大的同类,再进行运算:
byte,char,short的运算:
强制转换:
原码反码补码:
运算符:
不用说,我们都知道基础的运算符有这些:+ - * / %
但是我们要重点讲自增自减运算符。又称前置++,和后置++。其实这个在我之前已经讲过了,直接上链接:
CSDN世界上有两种程序员,一种是用++i,一种是用i++(C语言小白必看)_i++人-CSDN博客
ok,这里我就不细讲了。
转换:
隐式转换:
这里有几个个点
小范围数据可以直接可以给大范围数据:
比如:
public class Test2 {public static void main(String[] args) {int a=10;double b=10;}
}
也没有报错
而我们这样写就会报错:
这里做了一张图范围向下兼容表
运算时,数据范围小的和数据范围大的,需要讲运算范围小的提升为运算范围大的同类,再进行运算:
比如:
而不能用int去接收a+b的结果。
byte,char,short的运算:
这三种类型运算时会先转换为整型再进行运算。
比如我们只能这样写:
public class Test2 {public static void main(String[] args) {byte a=11;byte b=2;int c=a+b;}
}
而不能这样写:
强制转换:
将大范围转为小范围需要用强制转换,转换完可能会损失精度。
比如,这串代码:
public class Test2 {public static void main(String[] args) {byte a=126;byte b=(byte)(a+3);System.out.println(b);}
}
打印结果为:
为什么呢?
这是后就要提到我们的原码,反码,补码了。
原码反码补码:
我们知道计算机中存储的数据都是以二进制补码的形式存的。
正数的原反补都相同这个我们都知道
而负数规则是 反码=原码取反 补码=反码+1
我们来分析一下上面的代码
public class Test2 {public static void main(String[] args) {byte a=126;byte b=(byte)(a+3);System.out.println(b);}
}
首先一个字节有八个比特位,所以126的二进制表示为:0111 1110。所以补码也为0111 1110。
转换过程类似于这个图
Java常量优化机制:
为什么这个不会报错呢?
在编译时java.c会将3和5两个字面量进行运算,再进行赋值。
会将byte b=3+5; 变成 byte b=8;
我们在反编译字节码文件时也可以看到直接变为了byte b=8;