010_类型提升问题
一、概念部分
自动类型转换:容量小的数据类型可以自动转换为容量大的数据类型。这里的容量指一个类型的表述范围、如char(-27~27-1 -128~127)
强制类型转换:又被称为造型,用于显式的转换一个数值的类型、在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。
强制类型转换需要注意的是:当一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,就会被截断成为一个完全不同的值。如 : char c=(char) -3;
二、转换概念图
三、测试类型
public class TestClassCase { public static void main(String[] args) { //[√]因为123在byte这个类型的表述范围(-128~127)所以可以自动类型转换 byte a=123; //[X]因为300不在byte这个类型的表述范围(-128~127)所以编译错误 //byte b=300; //[X]因为-3不在char这个类型的表述范围(0~65535)所以编译错误 //char c=-3; //[√] char d='a'; //[√] int e=d; //[√] long f=123213; float g=f; //测试强制类型转换 int h=-100; //因为-100不在char这个类型的表述范围(0~65535)所以此处强制类型转换压制了编译错误、致使程序实际运行时将该-100截断为一个完全不同的值 char i=(char)h; //类型自动提升问题 long j=123; int k=2; //int l=j+k;//(此处报编译错误、因为a+b之后类型自动提升为long类型、将一个long类型赋值给一个int类型时编译错误 int money = 1000000000; //10亿 int years = 20; /* * 返回的是负数、要想结果正确必须将其中一个转换为long类型、这里不可(long)(money*years) * 因为money*years的值已经超出了int型的表述范围、本身已经溢出了、对一个已经溢出的做强转没有任何意义 * 为了结果正确、我们将money强转为long类型 */ long total = (long)money*years; long times = 70L*60*24*365*70;//将 System.out.println("d="+d); System.out.println("e="+e); System.out.println("g="+g); System.out.println("i="+i);//被截断为一个无意义的值 System.out.println("total="+total); } }
测试结果:
四、总结
a)做所有的二元运算符(+-/*%),都会有类型提升的问题!比如 一个int型(+、-、*、/、%)一个long类型、其运行结果会自动提升为(其中最高的类型)long类型
比如: long a=123; int b=2; int c=a+b;(此处报编译错误、因为a+b之后类型自动提升为long类型、将一个long类型赋值给一个int类型时编译错误)