锁定老帖子 主题:一个隐形的java int溢出
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-08-31
guoapeng 写道 这个bug经典,effective java 里面有讲到这一点,
Java的隐式转换确实问题很多。 1/4+3/4 =? 的问题虽然很基础,但是很重要。 类似的问题,算术计算方面的,谁来总结一下。 应该是用java.math.BigDecimal中的方法来进行运算了吧。 |
|
返回顶楼 | |
发表时间:2011-08-31
果断Mark,顶楼主!
|
|
返回顶楼 | |
发表时间:2011-08-31
直接在第一个常数后加L
|
|
返回顶楼 | |
发表时间:2011-08-31
i2534 写道 不知道什么时候也触发过此bug(最可能的是算时间: 24 * 60 * 60 * 1000).
所以现在一直习惯性的这样写:long l = 1L * XXX +1 |
|
返回顶楼 | |
发表时间:2011-08-31
这个真的是长见识了
回去复习effective java去.. |
|
返回顶楼 | |
发表时间:2011-08-31
weiqiang.yang 写道 引用 任意一个常量上加L,转long型就OK了,坑爹哇~~~这回真是阴沟里翻船了~~
这个说法是不正确的。。。 long msgInvalidDue = 60 * 24 * 3600 * 1000; System.out.println(msgInvalidDue); msgInvalidDue = 60 * 24 * 3600 * 1000L; System.out.println(msgInvalidDue); msgInvalidDue = 60 * 24 * 3600 * 1000 * 24L; // <-- 在乘以最后一个24L之前,已经溢出了 System.out.println(msgInvalidDue); msgInvalidDue = 60L * 24 * 3600 * 1000 * 24; // <-- 保险点还是放在最前面。。 System.out.println(msgInvalidDue); 输出 引用 889032704
5184000000 21336784896 124416000000 +1 |
|
返回顶楼 | |
发表时间:2011-08-31
lz说“任意一个常量上加L,转long型就OK了”,感觉还是不过保险,最好把第一个数转long型,如果把最后一个转long型,则有可能前面几个的成绩已经溢出了。
|
|
返回顶楼 | |
发表时间:2011-08-31
呵呵,这样的bug刚开始用java 做乘除发生过,以为会返回float的,可是实际总是被自动取整了
|
|
返回顶楼 | |
发表时间:2011-08-31
最后修改:2011-08-31
這邊有幾個類似的題目:
Promotion與Cast import java.util.*; import java.text.*; // 這個程式運算結果是錯的!錯在哪? public class Main { public static void main(String[] args) throws Exception { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date birth = dateFormat.parse(args[0]); Date current = new Date(); long life = current.getTime() - birth.getTime(); System.out.println("你今年的歲數為:" + (life / (365 * 24 * 60 * 60 * 1000))); } } public class Main { public static void main(String[] args) { System.out.println(Integer.MIN_VALUE == -Integer.MIN_VALUE); // true?false? } } |
|
返回顶楼 | |
发表时间:2011-08-31
我一般习惯用Long,这样如果不加L,编译器会提示。
|
|
返回顶楼 | |