我试图理解为什么这种乘法会导致错误的值:
long max = (60 * 24 * 60 * 60 * 1000);
这应该= 5,184,000,000
但在我的Java程序中它= 889,032,704
知道为什么会这样吗?
答案 0 :(得分:14)
您所乘的所有值都是int
s,因此结果为int
,在溢出已经发生后转换为long
。将其中一个因子设为long
,以便使用64b指令将它们相乘
尝试
long max = (60L * 24L * 60L * 60L * 1000L);
L
后缀指定常量是long
值,而不是int
常量。
如果整数文字后缀为ASCII字母L或l(ell),则其类型为
long
;否则它是int
类型(§4.2.1)。
两个乘法表达式的类型是其操作数的提升类型。
int
的和type promotion将其留作int
s:
应用扩展基元转换(第5.1.2节)来转换以下规则指定的一个或两个操作数:
- 如果任一操作数的类型为
double
,则另一个操作数将转换为double
。- 否则,如果任一操作数的类型为
float
,则另一个操作数将转换为float
。- 否则,如果任一操作数的类型为
long
,则另一个操作数将转换为long
。- 否则,两个操作数都将转换为
类型int
答案 1 :(得分:5)
这是由于整数溢出造成的。您的右侧产品表示为int
(所有操作数的默认类型),并且它无法保留您的“长”值。
只需将您的产品long
的第一个因素设为长期常数60L
,如迈克的答案,或明确地(long) 60
:
long max = (long) 60 * 24 * 60 * 60 * 1000;
你会得到你期望的。