论坛首页 Java企业应用论坛

一个隐形的java int溢出

浏览 30184 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-08-31  
guoapeng 写道
这个bug经典,effective java 里面有讲到这一点,
Java的隐式转换确实问题很多。
1/4+3/4 =? 的问题虽然很基础,但是很重要。
类似的问题,算术计算方面的,谁来总结一下。

应该是用java.math.BigDecimal中的方法来进行运算了吧。
0 请登录后投票
   发表时间:2011-08-31  
果断Mark,顶楼主!
0 请登录后投票
   发表时间:2011-08-31  
直接在第一个常数后加L
0 请登录后投票
   发表时间:2011-08-31  
i2534 写道
不知道什么时候也触发过此bug(最可能的是算时间: 24 * 60 * 60 * 1000).
所以现在一直习惯性的这样写:long l = 1L * XXX

+1 
0 请登录后投票
   发表时间:2011-08-31  
这个真的是长见识了
回去复习effective java去..
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2011-08-31  
lz说“任意一个常量上加L,转long型就OK了”,感觉还是不过保险,最好把第一个数转long型,如果把最后一个转long型,则有可能前面几个的成绩已经溢出了。
0 请登录后投票
   发表时间:2011-08-31  
呵呵,这样的bug刚开始用java 做乘除发生过,以为会返回float的,可是实际总是被自动取整了
0 请登录后投票
   发表时间: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?
    }
}
0 请登录后投票
   发表时间:2011-08-31  
我一般习惯用Long,这样如果不加L,编译器会提示。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics