Skip to content

类型转换

自动类型转换

类型范围小的变量, 可以直接赋值类型范围大的变量, 但反之则不行.

比如byte可以直接赋值给int, 但int不能直接赋值给byte, 因为int的范围比byte大.

例子

java
public class Test {
    public static void main(String[] args) {
        byte a = 12;
        test(a);
    }

    public static void test(int a) {
        System.out.println(a);
    }
}

如果反过来.

java
public class Test {
    public static void main(String[] args) {
        int a = 12;
        test(a);
    }

    public static void test(byte a) {
        System.out.println(a);
    }
}

报错: java: 不兼容的类型: 从int转换到byte可能会有损失.

执行原理

  • byte是8位, int是32位, int的范围比byte大, 所以可以直接赋值.
  • int是32位, byte是8位, int的范围比byte大, 不能直接赋值.
  • int的范围是-2147483648到2147483647, byte的范围是-128到127, 所以不能直接赋值.
  • byte的范围小于int的范围, 因此在赋值时需要进行类型转换.
  • int的范围大于byte的范围, 因此在赋值时不需要进行类型转换.

强制类型转换

类型范围大的变量, 可以强制转换类型范围小的变量, 但反之则不行.

例子

java
public class Test {
    public static void main(String[] args) {
        int a = 12;
        test((byte) a);
    }

    public static void test(byte a) {
        System.out.println(a);
    }
}

这个例子中, 方法会打印出12, 因为int的值在byte的范围内.

但是如果我们将int的值改为128, 就会打印出-128, 因为byte的范围是-128到127, 所以会发生溢出.

警告

强制类型转换会导致数据溢出(丢失), 需要谨慎使用!

浮点型强转成整数型, 会直接丢失小数部分.

表达式的自动类型提升

提示

什么是表达式: 表达式是由操作数和运算符组成的, 例如a + b, a * b, a / b等.

在表达式中, 小范围类型的变量, 会自动转换成表达式中较大范围的类型, 再进行计算.

警告

  • 表达式的最终结果类型由表达式中的最高类型决定.
  • 在表达式中, byte, short, char直接转换成int 类型参与运算的.