我正在尝试理解为什么这个乘法结果不正确:
long max = (60 * 24 * 60 * 60 * 1000);
这应该等于5,184,000,000。
但在我的Java程序中,它等于889,032,704。
有任何想法为什么会这样吗?
我正在尝试理解为什么这个乘法结果不正确:
long max = (60 * 24 * 60 * 60 * 1000);
这应该等于5,184,000,000。
但在我的Java程序中,它等于889,032,704。
有任何想法为什么会这样吗?
你正在进行乘法运算的所有值都是int
类型,因此结果也是int
类型的。在溢出发生之后将其转换为long
类型。让其中一个因数成为long
类型,以便使用64位指令进行乘法运算。
尝试一下。
long max = (60L * 24L * 60L * 60L * 1000L);
L
后缀指定常量是long
值,而不是int
常量。
语言规范中说:
如果整数字面值以ASCII字母L或l(小写L)结尾,则其类型为
long
;否则为int
类型(§4.2.1)。
乘法部分的说明如下:
乘法表达式的类型是其操作数的提升类型。
两个int
类型变量的类型提升会将它们保留为int
类型:
根据以下规则,应用扩展原始转换(§5.1.2)将一个或两个操作数转换为指定类型:
- 如果任一操作数的类型是
double
,则另一个操作数转换为double
。- 否则,如果任一操作数的类型是
float
,则另一个操作数转换为float
。- 否则,如果任一操作数的类型是
long
,则另一个操作数转换为long
。- 否则,两个操作数都转换为
int
类型
int
(所有操作数的默认类型),显然无法容纳你的“long”值。long
,可以使用长常量60L
,如Mike的答案中所示,或者显式转换为(long) 60
:long max = (long) 60 * 24 * 60 * 60 * 1000;