Java乘法运算行为

标签 java overflow integer-overflow

我写了一个方法将给定数字从天数转换为毫秒数:

private long expireTimeInMilliseconds;
...
public void setExpireTimeInDays(int expireTimeInDays)
{
   expireTimeInMilliseconds = expireTimeInDays * 24 * 60 * 60 * 1000;
}

我很难弄清楚我做错了什么。现在我的问题: 这个错误这么明显吗?

修正方法:

private long expireTimeInMilliseconds;
...
public void setExpireTimeInDays(int expireTimeInDays)
{
   expireTimeInMilliseconds = ((long) expireTimeInDays) * 24 * 60 * 60 * 1000;
}

如果我在计算之前不将整数转换为 long,我会得到一个完全错误的结果。

最佳答案

很明显吗?我想这取决于您使用 Java 的时间以及您必须处理毫秒数的次数。当然,最多 24 天左右应该没问题...

我觉得最大的提示应该是System.currentTimeMillis()返回一个long。这是一个很好的迹象,表明毫秒数可以变大。您设置的变量类型也应该是一个很好的提示。

当然,您知道如果您对整数进行算术运算,结果将是int,并在溢出时回绕。这是否足够明显可以进行辩论,但这将是一个毫无意义的讨论。在 C# 中,如果您打开溢出检查,您会很快发现错误 - 但没有多少开发人员这样做(事实上,我没有这样做,尽管我可能应该这样做)。

关于Java乘法运算行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/512266/

相关文章:

IE 中的 CSS 问题 : with custom ul, li 下拉导航,尤其是 ie6 溢出:可见错误

css - 出现滚动条时元素溢出容器

button - PayPal 按钮溢出

c++ - 浮点/整数类型转换的可靠溢出检测

c - c中的整数提升

java - java中循环出现问题

java - 反向迭代 ConcurrentSkipListMap

java 多级可滚动弹出菜单

java - 关于 Android API 中的新方法和弃用方法

c - 快速排序示例(K&R C 书)中的错误?