自动类型转换:
指的是容量小的数据类型可以自动转换为容量大的数据类型。
如下图:
黑色的实线表示无数据丢失的自动类型转换,而虚线表示在转换时可能会有精度的损失。
强制类型转换:
又被称为造型,用于显式的转换一个数值的类型。在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。
当将一种类型强制转换成另一种类型,而又超出了目标类型的表数范围,就会被截断成为一个完全不同的值。
常见面试题:
char 不能和byte、short 相互自动转换为什么? char具有两个字节,其数值范围是0 ~ 2^16-1,没有负数; short也是两个字节,范围为:-2^15 ~ 2^15-1。 |
为什么byte b = 100;编译通过,不报错? java中整型默认的是int类型;byte b = 100;相当于byte b = (byte)100; java编译器的优化: 对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过范围,那么javac编译器就会自动隐含地为我们补上一个强制类型转换(byte)(short)(char) 1、如果没有超出左侧的范围,自动补上强制类型转换 2、如果超出左侧的范围,编译直接报错 |
short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗? 对于short s1 = 1; s1 = s1 + 1;有错。由于1是int类型(java默认整数类型是int),因此s1+1运算结果也是int 型,需要强制转换类型才能赋值给short型。而short s1 = 1; s1 += 1;可以正确编译,因为s1+= 1;相当于s1 = (short)(s1 + 1);其中有隐含的强制类型转换。 |
能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象? 我们可以做强制转换,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,所以,如果强制转化,int 类型的高 24 位将会被丢弃,因为byte 类型的范围是从 -128 到127。 比如: int a = 129; byte b = (byte)a; //编译时,只看类型,不看值 System.out.println(b);//-127 |
基本类型转化时常见错误和问题:
操作比较大的数时,要留意是否溢出,尤其是整数操作时。
int money = 1000000000; //10亿
int years = 20;
//返回的total是负数,超过了int的范围
int total = money*years;
System.out.println("total="+total);
//返回的total仍然是负数。默认是int,因此结果会转成int值,再转成long。但是已经发生了数据丢失
long total1 = money*years;
System.out.println("total1="+total1);
//返回的total2正确:先将一个因子变成long,整个表达式发生提升。全部用long来计算。
long total2 = money*((long)years);
System.out.println("total2="+total2);
关注公众号,获取免费软件、资料,笔记等。