为什么以下计算产生负值?
long interval = 0;
interval = ((60000 * 60) * 24) * 30;
答案 0 :(得分:36)
其中的每个表达式都被评估(在编译时,当然;它是常量),而不是int * int
而不是long * long
。结果在某些时候溢出。因此,只需使用L
使所有操作数文字变长:
interval = ((60000L * 60L) * 24L) * 30L;
当然,你只能让一些的操作数很长,但我倾向于发现更改一切更容易。
说完所有这些,如果你正在寻找“30天毫秒”,那么最好使用:
long interval = TimeUnit.DAYS.toMillis(30);
答案 1 :(得分:3)
试试这个,它不会是否定的:
long interval = 0;
interval = ((60000L * 60L) * 24L) * 30L;
答案 2 :(得分:2)
因为等式的值导致数字如此之大以至于它包裹它将导致整数。 Int
答案 3 :(得分:2)
您的值为2592000000,大于最大有符号整数值2 ^ 31(2147483648)。这称为整数溢出,结果溢出为负。