Java_语法基础_不要让类型默默转换

来源:互联网 发布:卖家如何联系淘宝小二 编辑:程序博客网 时间:2024/05/29 16:27

例:

package deep;public class Client {    // 光速是30万公里/秒,常量    public static final int LIGHT_SPEED = 30 * 10000 * 1000;    public static void main(String[] args) {        System.out.println("题目1:月亮光照射到地球需要1秒,计算月亮和地球的距离。");        long dis1 = LIGHT_SPEED * 1;        System.out.println("月亮与地球的距离是:" + dis1 + "米");        System.out.println("---------------------------------------");        System.out.println("题目2:太阳光照射到地球上需要8分钟,计算太阳到地球的距离。");        long dis2 = LIGHT_SPEED * 60 * 8;        System.out.println("太阳到地球的距离是:" + dis2 + "米");    }}

运行结果:
题目1:月亮光照射到地球需要1秒,计算月亮和地球的距离。
月亮与地球的距离是:300000000米
—————————————
题目2:太阳光照射到地球上需要8分钟,计算太阳到地球的距离。
太阳到地球的距离是:-2028888064米

为什么太阳到地球的距离是负的?那是因为Java是先运算然后再进行类型转换的,具体地说就是因为dis2的三个运算参数都是int类型,三者相乘的结果虽然也是int类型,但是已经超过了int的最大值,所以其值就是负值了,再转换成long型,结果还是负值。
问题知道了,解决起来也很简单,只要加个小小的“L”即可,代码如下:

long dis2 = LIGHT_SPEED * 60L * 8;

60L是一个长整型,乘出来的结果也是长整型(此乃Java的基本转换规则,向数据范围大的方向转换,也就是加宽类型),在还没有超过int类型的范围时就已经转换为long型了,彻底解决了越界问题。在实际开发中,更通用的做法是主动声明式类型转化(注意不是强制类型转换),代码如下:

long dis2 = 1L * LIGHT_SPEED * 60 * 8;

既然期望的结果是long型,那就让第一个参与运算的参数也是long型(1L)吧,也就是明说:“嗨,我已经是长整型了,你们都跟着我一起转为长整型吧”。

0 0
原创粉丝点击