数据类型转换

64 阅读2分钟

自动类型转换

自动类型转换是指的是容量小的数据类型可以自动转换为容量大的数据类型。如图,实现表示无数据丢失的自动类型转换,而虚线表示在转换时可能会有精度丢失。

image.png


public class TestOperator7 {
  public static void main (String[] args) {
    // 容量小的类型可以自动转化成容量大的类型
    int a = 2345;
    long b = a; // int类型转化为long类型
    // int c = b;  报错,long类型不能转化成int
    double d = b; // long类型转化为double
    float f = b; // long类型转化为float
  }
}

特例:整型常量是int类型,但是可以自动转成byte/short/char.只要不超过对应类型的表数范围

public class TestOperator7 {
  public static void main (String[] args) {
    byte h1 = 123;
    // byte h2 = 1234; 已经超过了byte的表数范围
    char h3 = 97;
    System.out.println(h3); // a
  }
}

强制类型转换

强制类型转换,又称为造型(cast);用于强制转换数值的类型,可能损失精度;

public class TestOperator8 {
  public static void main (String[] args) {
    double a = 3.94152;
    int b = (int)a; // 3; 浮点数强制转为整数,直接丢失小数部分
    System.out.println(b); // 3

    int c = 97;
    char d = (char)c;
    System.out.println(d); // a;

    // 强制转型,超过了表数范围,则会转成一个完全不同的值;
    byte e = (byte)300;
    System.out.println(e); // 44, 没有规律不用记
  }
}

类型转换常见错误

最常见的就是溢出问题:

public class TestOperator9 {
  public static void main (String[] args) {
     int money = 1000000000;
     int year = 20;
     // 返回的total 是负数,超过了int的范围
     int total = money * year;
     System.out.println(total); // -1474836480

    //  返回的total1仍然是负数。默认是int, 因此结果会转成int智,再转成long
    long total1 = money * year;
    System.out.println(total1); // -1474836480

    // 返回的total2正确,现将一个因子变成long,整个表达式发生提升,全部都变成了long类型
    long total2 = money * (long)year;
    System.out.println(total2); // 20000000000;
  }
}