算术运算符
测试一:JVM会如何处理这几种类型的运算
低于4B的,全部转成int进行运算
public class Add {
public static void addByte() {
byte a = 1;
byte b = 2;
System.out.println(a + b);
}
public static void addChar() {
char a = 1;
char b = 2;
System.out.println(a + b);
}
public static void addShort() {
short a = 1;
short b = 2;
System.out.println(a + b);
}
public static void addInt() {
int a = 1;
int b = 2;
System.out.println(a + b);
}
}
测试二:如何处理8字节数据的运算:double、long
会涉及到数据的合与拆,需要画堆栈图
public class Add {
public static void addLong() {
long a = 1;
long b = 2;
System.out.println(a + b);
}
public static void addDouble() {
double a = 1;
double b = 2;
System.out.println(a + b);
}
}
测试三:不同类型进行运算
public class DifferentAdd {
// 隐含转换 自动类型转换
static void t1() {
int a = 1;
long b = 2;
System.out.println(a + b);
}
// 显示转换
static void t2() {
double a = 1;
int b = (int) a;
System.out.println(a + b);
}
}
强制类型转换
什么时候需要强制类型转换
1、字节多的转字节少的:8=>4、4=>2、4=>1
2、不同类型之间:整型转浮点型、浮点型转整型
加加减减运算符
赋值运算符
包含这些
测试一:JVM执行这两个方法的代码,底层有何差异
一个是iinc指令,一个是很多指令的组合,跟++操作类似
public class TestAddEqual {
static void t1() {
int a = 10;
a += 20;
System.out.println(a);
}
static void t2() {
double a = 10;
a += 20;
System.out.println(a);
}
}
测试二:JVM执行这三个方法的代码,底层有何差异
JVM处理t1、t2与处理++类似,处理其他的操作符就是通过指令组合实现
public class TestAddEqual {
static void t1() {
int a = 10;
a += 20;
}
static void t3() {
int a = 10;
a -= 20;
}
static void t4() {
int a = 10;
a *= 20;
}
}
运算符优先级
对比这三段代码:
- JVM在运行时是如何识别运算符优先级的呢?
JVM处理方法t1与其他两个方法有什么不同呢?
public class TestPriority { void t1() { int a = (1 + 2) * 3; } void t2() { int x = 1; int y = 2; int z = 3; int a = (x + y) * z; } void t3() { int x = 1; int y = 2; int z = 3; int a = x + y * z; } }