以下代码段为乘法提供了正确的结果

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/

10-11 22:30
查看更多