黑马程序员技术交流社区

标题: 运算后赋值给long类型变量的陷阱 [打印本页]

作者: 海狮    时间: 2015-10-17 22:51
标题: 运算后赋值给long类型变量的陷阱
在计算过程中,遇到高位数据类型才会转换,未遇到,不会转换
测试实例:
  1. class TestDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.         long a=70*60*24*365*70;
  6.         System.out.println(a);
  7.         }
  8. }
复制代码

结果为
  1. -1719527296
复制代码

原因是70、60、24、365、70都是int类型,他们的运算结果自然也是int类型,得到的结果超出int范围,导致结果溢出,赋值给long类型的变量a时,自动转换为long类型,之前结果已经掉失精度,赋值给long自然也掉失了
解决方法,在运算时加入long类型操作数
  1. class TestDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.         long a=70*60*24*365*70*1L;//在最后*1L
  6.         System.out.println(a);
  7.         }
  8. }
复制代码

结果依然为:
  1. -1719527296
复制代码

问题未解决,虚拟机只有在遇到高数据类型才会提升,除了byte,short会自动提升。
所以代码应该这样写:
  1. long a=1L*70*60*24*365*70;
复制代码

结果为
  1. 2575440000
复制代码

这样问题才算解决
也可以这样写:
  1. long a=70L*60*24*365*70;
复制代码

或者这样写
  1. long a=(long)70*60*24*365*70;
复制代码

但不能这样写
  1. long a=(long)(70*60*24*365*70);
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2