V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
champloo
V2EX  ›  Java

Java int 和 long 进行运算时,发生的奇怪事情(我重新排版了,第二次发帖不懂格式)

  •  
  •   champloo · 2019-08-25 19:31:37 +08:00 · 3998 次点击
    这是一个创建于 1908 天前的主题,其中的信息可能已经有所发展或是发生改变。
    自己写了一个 app,在造数据进行测试时,发生了一件升起的事情
    如下图:
    b 是由 a-i*86399999 得到,二者均为 long 类型
    但发现在 86399999 这个数字后如果不加 l,会发生以下事件
    b 居然比 a 大!
    我是这样发现的:一开始我并没有加 L,后面猜测会不会是 long 和 int 加减的问题,遂在 86399999 后加了这个 L
    注释一下:86399999 是一天 24 小时总共的时间戳,我为了生成每天的数据弄的这个值
    7 条回复    2019-08-26 18:57:25 +08:00
    champloo
        1
    champloo  
    OP
       2019-08-25 19:31:48 +08:00
    champloo
        2
    champloo  
    OP
       2019-08-25 19:31:56 +08:00
    champloo
        3
    champloo  
    OP
       2019-08-25 19:42:51 +08:00
    解决了!是 int 精度溢出的问题,因为会先进行乘法运算!
    msg7086
        4
    msg7086  
       2019-08-26 08:08:49 +08:00
    「因为会先进行乘法运算!」

    要不然呢…… int 乘 int 当然会溢出了,就算最后存入 int64 变量也一样是溢出后的结果了。
    Raymon111111
        5
    Raymon111111  
       2019-08-26 11:14:57 +08:00
    int 做乘法都要小心溢出的问题
    ZiLong
        6
    ZiLong  
       2019-08-26 11:49:14 +08:00
    数字默认是 int 型的,当运算的两个数据类型没有大小之分,就不会转型,所以 int 乘 int 就溢出了,跟 a/b 是不是 long 型没有关系,有建议,在使用 long 型的时候加个 1L*显式声明
    champloo
        7
    champloo  
    OP
       2019-08-26 18:57:25 +08:00
    @ZiLong @Raymon111111 @msg7086 蟹蟹回复,以后会记住这一点!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5307 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 07:51 · PVG 15:51 · LAX 23:51 · JFK 02:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.