java类型转换

​自动类型转换:

指的是容量小的数据类型可以自动转换为容量大的数据类型。

如下图:

黑色的实线表示无数据丢失的自动类型转换,而虚线表示在转换时可能会有精度的损失。

强制类型转换:

又被称为造型,用于显式的转换一个数值的类型。在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。

当将一种类型强制转换成另一种类型,而又超出了目标类型的表数范围,就会被截断成为一个完全不同的值。


常见面试题:

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);

 关注公众号,获取免费软件、资料,笔记等。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心之所向...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值