建议23:不要让类型默认转换

先上代码:

public class Test
{
/**
* 先积累点常识:
* 2的32次方为4294967296
* 光速为30万公里每秒,月亮椭圆形,近地点距离约为36万公里,远地点距离约为40万公里,平均为38万公里
* 太阳距地球距离14 960万公里,太阳光照射到地球需要8分多钟
*/
public static final int LIGHT_SPEED = 30*10000*1000;
public static void main(String[] args)
{
System.out.println("月亮光照射到地球需要时间为大概为一秒,计算月亮和地球之间的距离:");
long disMoon = LIGHT_SPEED*1;
System.out.println("月亮与地球之间距离约为: "+disMoon);

System.out.println("太阳光照射到地球需要时间为大概为八分钟,计算太阳和地球之间的距离:");
long disSun = LIGHT_SPEED*60*8;
System.out.println("太阳与地球之间距离约为: "+disSun);
}
}

输出结果为:
月亮光照射到地球需要时间为大概为一秒,计算月亮和地球之间的距离:
月亮与地球之间距离约为: 300000000
太阳光照射到地球需要时间为大概为八分钟,计算太阳和地球之间的距离:
太阳与地球之间距离约为: -2028888064

看出问题来了吧!30*1000*1000*60*8结果应该是14400000000
但为什么会出现负数这样的结果了,而且计算结果返回的结果明明已经是long型了?
看了秦哥解释才知道,java是先进行运算,然后再进行数据类型转换。由此再来看看计算代码:
long disSun = LIGHT_SPEED*60*8;由于三个乘数都是int型,先进行运算,结果超出了int类型最大值4284967296,就会为负数,再转换成long型,结果还是负数。(就如byte i =(byte) 128转换后结果:i = -128;)
知道问题所在就好办事了,回归主题,不要让类型转换默然转换,反之就是主动声明类型转换。
修改如下:
long disSun =1L* LIGHT_SPEED*60*8;
System.out.println("太阳与地球之间距离约为: "+disSun);
输出如下:
太阳与地球之间距离约为: 144000000000

小结:若期待结果类型是某(long)型,那就让第一个参与运算的参数主动声明为某(long)型,这样就可以避免潜在的类似问题的发生。

你可能感兴趣的:(建议23:不要让类型默认转换)