当前位置: 首页 > 知识库问答 >
问题:

Java中奇怪的计算行为[重复]

谢学名
2023-03-14

为什么第一次计算的结果比第二次计算的结果大?

System.out.println(new Date().getTime() - (1000*60*60*24*30*3));
System.out.println(new Date().getTime() + (1000*60*60*24*30*3));

结果:

Info:   1440788283924
Info:   1439160414740 

共有2个答案

潘楚
2023-03-14

Integeroverflow正在发生在您的案例中,1000*60*60*24*30*3的值变为-813934592

洪星文
2023-03-14

表达方式

1000*60*60*24*30*3

导致32位整数溢出。解决此问题的一种方法是将第一个操作数设为long,这将迫使整个表达式变为long类型:

1000L*60*60*24*30*3
 类似资料:
  • 我在做Maven项目。我用log4j做了一个日志。但它在给定的文件中显示了一些starnge日志。我试图理解,为什么会出现这种奇怪的日志,但我不明白。请帮助我,为什么这些不需要的行会进入日志文件。 请帮我把这个拿开。 log.properties 我通过阅读这个链接创建了这个文件。 代码是 日志txt-(log.txt的一些起始行)

  • 我有以下代码片段: 如果我调用foo(null)为什么没有歧义?为什么程序调用foo(字符串x)而不是foo(对象x)?

  • 问题内容: 为什么此代码有效? 为什么这会引发异常? 但是最奇怪的是,该代码也可以成功运行,没有任何异常: 看来Java的三元运算符会改变行为。有人可以解释为什么吗? 问题答案: 该行为在JLS- 条件运算符中 指定: 如果第二和第三个操作数中的一个是原始类型T的,并且其他的类型是施加装箱转换(§5.1.7)到T的结果,则 条件表达式的类型为T 。 强调我的。因此,在第二种情况下: 由于第三个操作

  • 但最奇怪的是,这段代码也在没有任何异常的情况下成功运行: 看起来Java的三元运算符改变了行为。有人能解释一下这是为什么吗?

  • 所以我更新了代码,添加了行所做的是将主线程置于Hibernate状态一段时间,因此jvm可以获得一些时间来创建一个新线程。我正在得到我的预期输出

  • null 结果将是0xFFFFFFFFFFFFFFFF0000(正确,寄存器溢出,但我们只更改2字节) 结果将为0x00000000000000000000(WTF?,寄存器溢出,但结果更改所有8个字节而不是4个字节。为什么是0x00000000000000,而不是0xFFFFFF00000000)