java - 为什么这个 java 表达式返回一个负结果?

标签 java math date

public static void main (String[] ses) {
    System.out.println(740 * (24 * 60 * 60 * 1000));
}

在谷歌上试过,它在科学计算器上也给出了不同的结果。

最佳答案

因为结果是 63,936,000,000,这超出了您可以存储在 Java 整数中的数量(默认情况下,因为它们都没有以 L 开头)。一个整数只能存储 4 个字节(32 位),而这个数字需要 36 位。然后它溢出,基本上只使用结果的最后(第一个?)32 位。因为这些位的第一个(最后一个?取决于你如何看待它)决定了一个数字是否有符号,当这个数字再次被实际视为整数时,它显示为负数。

这对于计算哈希值特别有用,因为我看到的唯一合乎逻辑的选择是使所有超过最大值的数字都等于最大值,我认为我们可以同意这是一个糟糕的选择。

如果你做到了 System.out.println(740L * (24 * 60 * 60 * 1000)); 它应该使用可以存储更大数字的 long。

你会注意到我在这里有问号 - 字节是字节,比特是比特。真正重要的是你如何解读它们。在软件开发社区中,对于第一个数字、位或字节的真正含义存在争议。将“1234”视为一个数字。 1是第一个数字吗?大多数普通人会同意它是,因为当我们看到它时,它首先被写下来。但其他人会认为 4 是第一个数字,因为为了计算目的这样做很方便。 (考虑添加 - 你先在哪里添加?那不是第一个数字吗?)

所以这就是为什么我首先/最后说的时候显得优柔寡断 - 我只是想弄清楚发生了什么。

关于java - 为什么这个 java 表达式返回一个负结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8571905/

相关文章:

java - eclipse中如何自动导出项目?

JDK 1.3 中的 Java native 访问

javascript - 网格中的 EXTJS 日期字段未显示/格式化

date - Unix 纪元时间在闰秒时钟上的表现如何?

java - 如何在 OnTouchListener 中获取初始 X、Y 值(第一次触摸 ACTION_DOWN)

algorithm - 计算两个值的排列数,对运行有限制

algorithm - 软件开发中的非确定性有限状态机?

c - C语言中的斐波那契数列

java - Android:如何以用户的语言获取当前的星期几(星期一等)?

java - 需要将小写下划线字符串更改为 camelCase