我试图理解为什么这个乘法导致不正确的值:
long max = (60 * 24 * 60 * 60 * 1000);
Run Code Online (Sandbox Code Playgroud)
这应该= 5,184,000,000
但在我的Java程序中它= 889,032,704
知道为什么会这样吗?
Mik*_*uel 15
所有你乘以一个数值是int如此的结果是一个int被转换为long溢出已经发生了.使其中一个因子a long使用64b指令乘以它们
尝试
long max = (60L * 24L * 60L * 60L * 1000L);
Run Code Online (Sandbox Code Playgroud)
的L后缀指定常数是一个long值,而不是一个int常数.
该语言规范说
如果整数文字
long后缀为ASCII字母L或l(ell),则为整数文字; 否则它是类型int(§4.2.1).
乘法表达式的类型是其操作数的提升类型.
和s的类型推广将int它们作为ints:
应用扩展基元转换(第5.1.2节)来转换由以下规则指定的一个或两个操作数:
- 如果任一操作数是类型
double,则另一个操作数转换为double.- 否则,如果任一操作数是类型
float,则另一个操作数转换为float.- 否则,如果任一操作数是类型
long,则另一个操作数转换为long.- 否则,两个操作数都将转换为类型
int
这是由于整数溢出.您的右侧产品表示为int(所有操作数的默认类型),并且它无法保持您的"长"值.
只需制作产品的第一个因素long,或者像60L迈克的答案那样长期不变,或者明确地将其强制转换(long) 60:
long max = (long) 60 * 24 * 60 * 60 * 1000;
Run Code Online (Sandbox Code Playgroud)
你会得到你所期望的.
| 归档时间: |
|
| 查看次数: |
2289 次 |
| 最近记录: |