以下代码段为乘法提供了正确的结果
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
的类型从int
提升为long long
。(long long) (var0 * var1)
~~~~~~~~~~~~~
1
~~~~~~~~~~~~~~~~~~~~~~~~~
2
在第二个代码中,发生第一次乘法运算,结果不适合long
类型,因此之后的强制转换不再有用。它强制转换之前溢出的数字。因此,第一个比第二个要好,以避免溢出。
关于c - 在C中进行类型转换时的运算符优先级,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28087339/