Java中基本数据类型转换

java是一种强类型语言,在java中,数据类型主要有两大类,基本数据类型和引用数据类型,不同的数据类型有不同的数据存储方式和分配的内存大小。

 

由于在java中,整数默认是采用int型,浮点数默认采用的是double型进行存储,所以在定义long型和float型数据时,必须在数值后面加'l','L'和'f','F'。

 

Java数据类型转换

在java中,存在两种转换的机制,默认类型转换(隐式转换)和强制类型转换。默认类型转换的规则如下:

  •   小    -----------------------------------------------------------------     大
  • byte,short,char  >>>  int  >>>  long  >>>  float   >>>  double         (取值范围排序  左小右大)
  • 当byte,short,char相互之间不能转换,它们参与运算首先将转换成int类型进行运算。

 

 

自动转换

特点:

1、系统自动完成的,不需要程序员手动修改代码

2、将取值范围小的类型 自动提升为 取值范围大的类型

public class MusicDay{
    public static void main(String[] args) {
        int number_1 = 1;
        int number_2 = 2;    
        float number_3 = number_1 + number_2;  // 数据范围小的int自动转换为数据范围大的float
        System.out.println(number_3);       // 输出结果为3.0 (float类型)
    }
}

 

 

自动转换也要小心数据溢出问题,如下:

代码没任何问题,但结果却输出的是负数,这是因为两个 int 相乘得到的结果是 int, 相乘的结果超出了 int 的数据范围。这种情况,一般把第一个数据转换成范围大的数据类型再和其他的数据进行运算。

public class MusicDay{
    public static void main(String[] args) {
        int count = 100000000;
        int money = 1999;
        long totalPrice = count * money; 
        System.out.println(totalPrice);  // 输出结果为-1963462912 范围溢出产生了错误 
    }                     // 可以把参与计算的其中一个数据声明为高范围数据,它们会自动进行范围提升就没问题了。
}

 

强制转换

特点:

1、需要程序员手动修改代码

2、语法:

数据范围小的类型 变量名 = (数据范围小的类型)数据范围大的类型的数据

3、从数据范围小 到 数据范围大(将数据范围大的类型强制转换成数据范围小的类型。)

 

public class MusicDay{
    public static void main(String[] args) {
        float num_1 = 1.0f;
        float num_2 = 2.0f;
        float num_3 = num_1 + num_2;
        int num_4 = (int) num_3;     // 将float类型的num3强转为int类型并赋值给num_4
        System.out.println(num_3);   // 输出结果3.0 (float类型)
        System.out.println(num_4);   // 输出结果为3 (int类型)
    }
}

 

以上代码符合我们的预知,属于正常的转换与丢失精度的问题。我们更需要注意到是数据溢出的问题: (数据溢出导致了数据循环了一次进行输出)

 

public class MuiscDay{
    public static void main(String[] args) {
        int num_1 = 128;
        byte num_2 = (byte) num_1;   // 将int类型的num_1强制转换为byte类型
        System.out.println(num_2);   // 输出结果为-128,是因为数据溢出。
    }                   // byte类型的最大值为127,128明显大于127,所以导致了循环,输出结果变成了-128(byte的最小值)。
}

 

我们可以通过方法来查看该类型的数据范围:   (详细方法点击进行跳转)

public class MusicDay{
    public static void main(String[] args) {
        System.out.println("Byte最小值为" + Byte.MIN_VALUE  +  "  Byte最大值为" + Byte.MAX_VALUE);
        // 输出结果为:Byte最小值为-128  Byte最大值为127
    }
}

 

类型提升

所谓类型提升就是指在多种不同数据类型的表达式中,类型会自动向范围表示大的值的数据类型提升。

public class MusicDay{
    public static void main(String[] args) {
        long count = 10_0000_000;    // 声明其中一个值为高范围数据类型
        int money = 1999;          
        long total = count * money;   // 两者计算时,其结果会自动上升为它们其中的高范围数据类型
        System.out.println(total);   // 输出结果为199900000000 (long类型)
    }
}

 

posted @ 2021-02-09 22:58  MieDidXiang  阅读(190)  评论(0)    收藏  举报