关于byte/short/char三种类型的赋值问题

我们先来看一段代码。

byte num = 30;

这段代码看起来没有任何问题。但是大家都知道,Java中浮点数的默认值是double类型,整数的默认值是int类型。如果我们要写一个float类型的浮点数需要怎么写呢?

float f = 2.5f;

这里我们用上了强制类型转换,否则这段代码是要报错的。那么小伙伴们发现问题的所在了么?为什么第一段代码中等号右边的变量没有用强制类型转换?而且这段代码即使写到编译器中也是正确格式,也可以正确的运行。这里我们要了解一个新的小知识点。对于byte/short/char三种类型来说,若果右侧赋值的数值没有超过他们本身的取值范围,那么编译器将会隐式的为我们补上(byte)(short)(char)。也就是说,第一段代码的效果其实等同于byte num = (byte)30;。而如果右侧赋值的数值超过了其本身的取值范围,那么编译器就会直接报错。
我们再来看另一个例子。
在这里插入图片描述
这是一个很简单的代码。那么大家知道这里为什么会报错么?
我们之前学过,short/byte/char三种类型相加时,会自动转型为int类型,那么上面这段代码中,变量a是short类型,变量b也是short类型。但是a + b,会自动变成两个int类型的数相加,那么int型加int型,结果也一定是int型变量,所以最后的result也应该是int类型,而不是short类型。但是如果我们这么写:
在这里插入图片描述
这样就把两个变量相加,变成了两个常量相加,这称为“编译器的常量优化”在.java文件被编译成.class文件时,short result = 5 + 8;会直接变成short result = 13;因为等号右边的值是两个常量,常量的值不会改变,那么result的结果也不会改变。编译器的常量优化只有在等号右边全部都是常量时才可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值