java之算数运算符

304 阅读3分钟

我们在这里针对+号这个算术运算符进行说明,别的算术运算符同理

public class Test{
    public static void main(String[] args){
        int x = 1;
        x = x + 1;
        //这个过程发生了什么?
        //1:首先在java虚拟机开发的栈中开辟出一块空间,这块空间有一个int类型的变量x, 在存储区的常量缓冲区中有一个常量1,将这个常量1 copy出一份将值赋给x
        计算的时候在栈内存中临时开辟出一块内存,将x拷贝一份,1+1以后将值再次赋值给x,此时x=2;
    }
}

类型提升

  1. 在java虚拟机开辟的存储区中,常量缓冲区中的整型都是int类型,浮点型都是doubel类型,在进行算数运算的时候会发生类型提升,即一个算数表达式返回的最终结果取决于这个算数表达式中的所占最大内存或者最大精度的类型
public class Test{
    public static void main(String[] args){
        byte a = 12;
        a = (byte) (a+1);//这里因为1是从常量缓冲区中取出的是一个32个bit位的数,因此返回的结果是一个占比较大内存的类型的数据是int类型,上面的a是一个byte类型,盛放不下,因此需要进行强制类型转换;
        long l = 3L;
        float f = 12.4F;
        a = (long)(a + f);
    }
}

等号后面是一个常量与一个表达式的区别

  1. 如果后面是一个常量的话,会发生自动类型转换
  2. 如果后面是一个表达式的话,不会发生自动类型转换,需要根据数据类型所占内存的大小或者精度大小进行强制转换

a++ 与 ++a的区别

  1. java在针对一个表达式进行计算的时候,从常量缓冲区中取出一个值的副本,参与运算的地方并不是在自己变量所在的内存空间进行计算,而是产生一个临时的副本,存储原来的值,最后将副本中运算后的值赋给某一个变量
 public class Test{
    public static void main(String[] args){
        int a = 1;
        a = a + 1;
        //这个运算在内存中是这样的,首先在占内存中临时开辟出一块临时空间放置了常量1,然后在常量缓冲区中取出1,参与运算以后,临时空间的值变成了2最后赋值给了a因此此时为2;
    }
 }
  1. 理解了上面的例子,我们对a++和++a的理解就容易了,首先需要明确一点的是 a++是先开辟临时内存再自增,++a是先自增再开辟临时内存,需要注意的是这里的自增,增加的是自己,而并非临时内存中的值
public class Test{
    public static void main(String[] args){
        int a = 1;
        int b = a++; //1
        //因为++在后是先开辟内存,并将内存中的值赋给了b,因此b为1
    }
}

public class Test{
    public static void main(String[] args){
        int a = 1;
        int b = ++a; //1
        //因为++在后是先自增再开辟内存,并将内存中的值赋给了b,因此b为2
    }
}

切记+=是一个赋值操作符

public class Test {
    public static void main(String[] args) {
        byte b = 12;
        b+=12;
        byte c = b;//这里可以直接用byte类型来接受数据的原因就是+=是一个赋值操作符,当我们用 byte c = b + 12;的时候就需要进行强制类型转换了;因为=后面一个表达式而非常量值,因此不会发生自动类型转换
        System.out.println(c);
    }
}