不要让类型默默转换

简介:
复制代码
 1 public class Client {  
 2     // 光速是30万公里/秒,常量  
 3     public static final int LIGHT_SPEED = 30 * 10000 * 1000;  
 4     public static void main(String[] args) {  
 5         long dis1 = LIGHT_SPEED * 1;  
 6         System.out.println("光速1s:" + dis1 + "米");  
 7         long dis2 = LIGHT_SPEED * 60 * 8;  
 8         System.out.println("光速8分钟:" + dis2 + "米");  
 9     }  
10 }
复制代码

打印输出:

光速1s:300000000米
光速8分钟:-2028888064米

诡异,dis2已经考虑到int类型可能越界的问题,并使用了long型,但还是出现了负值。

 

因为Java是先运算然后再进行类型转换的,即是说运算的时候是以int类型运算,最后才将类型转换成long类型,所以会发生越界的情况。

disc2的三个运算参数都是int类型,三者相乘的结果虽然也是int类型,但是已经超过 了int的最大值,所以其值就是负值了(为什么是负值,因为过界了就会从头开始),再转换成long型,结果还是负值.

解决办法,只要加个"L"即可:

long dis2 = LIGHT_SPEED * 60L * 8;

这样就彻底解决了越界问题,在实际开发中,更通用的做法是主动声明式类型转换(注意不是强制类型转换),如:

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

既然期望的结果是long类型,那就让第一个参数与运算的参数也是long型。

 

注意:基本类型转换时,使用主动声明方式减少不必要的Bug

 



本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/5424852.html,如需转载请自行联系原作者
相关文章
|
4天前
|
Java Spring
使用枚举定义常量更好点儿
使用枚举定义常量更好点儿
17 1
|
7月前
|
存储 JSON 安全
Go语言类型分支大法秒杀一切未知类型!
Go语言类型分支大法秒杀一切未知类型!
30 0
|
4天前
|
存储 Oracle Java
关于数据类型与变量的一些浅见
关于数据类型与变量的一些浅见
22 2
|
9月前
|
前端开发
前端学习笔记202306学习笔记第三十八天-封装检测数据类型得方法1
前端学习笔记202306学习笔记第三十八天-封装检测数据类型得方法1
41 0
前端学习笔记202306学习笔记第三十八天-封装检测数据类型得方法1
|
9月前
|
前端开发
前端学习笔记202306学习笔记第三十八天-封装检测数据类型得方法2
前端学习笔记202306学习笔记第三十八天-封装检测数据类型得方法2
41 0
前端学习笔记202306学习笔记第三十八天-封装检测数据类型得方法2
|
11月前
|
存储 C#
【c#入门杂选】-显性转换,和隐形转换
【c#入门杂选】-显性转换,和隐形转换
95 0
【c#入门杂选】-显性转换,和隐形转换
|
测试技术
字符串a和他许久未见面的同父异母的b(模拟)(思维)
字符串a和他许久未见面的同父异母的b(模拟)(思维)
61 0
|
安全 JavaScript
学习TypeScrip2(任意类型)
TypeScript 3.0中引入的 unknown 类型也被认为是 top type ,但它更安全。与 any 一样,所有类型都可以分配给unknown
60 0
|
关系型数据库 MySQL
【硬着头皮】 停手,时间格式转换不一定要在外面转换
【硬着头皮】 停手,时间格式转换不一定要在外面转换
105 0
【硬着头皮】 停手,时间格式转换不一定要在外面转换
|
JavaScript
手摸手一起学习Typescript第四天 - 类型推论,联合类型 和 类型断言
手摸手一起学习Typescript第四天 - 类型推论,联合类型 和 类型断言