下面的代码给出了正确的乘法结果
int var0 = 245895;
int var1 = 478565
long long val = 0;
val = (long long) var0 * var1;
但这篇文章给出了错误的结果:
int var0 = 245895;
int var1 = 478565
long long val = 0;
val = (long long) (var0 * var1);
有人能帮我解释为什么吗?
(long long) var0 * var1
~~~~~~~~~~~~~~~~
1
~~~~~~~~~~~~~~~~~~~~~~~
2
在上面的代码中,首先var0
投射到long long
,之后乘法的结果将计算为long long
没有溢出。事实上编译器会提升类型var1
from int
to long long
隐含地。
(long long) (var0 * var1)
~~~~~~~~~~~~~
1
~~~~~~~~~~~~~~~~~~~~~~~~~
2
在第二个代码中,发生第一次乘法并且结果不适合long
类型,所以之后的转换不再有帮助。它转换之前溢出的数字。
因此,第一个比第二个更好地避免溢出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)