在 C 中进行类型转换时的运算符优先级

Operator precedence while type casting in C

下面的代码给出了乘法的正确结果

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);

谁能帮我看看为什么?

首先,您将 var0 转换为 long long,然后将其与 var1 相乘,在第二个中,您将两个变量相乘,然后将结果转换为 long long.后者更容易出现整数溢出,因为位数较少。

关于优先级:乘法的优先级为3,而圆括号的优先级为1 的优先级 - 最高可能。有关运算符优先级的完整列表,请查看 here.

(long long) var0 * var1
~~~~~~~~~~~~~~~~
       1
~~~~~~~~~~~~~~~~~~~~~~~
           2

在上面的代码中,首先var0转换为long long,然后乘法结果将计算为long long,不会溢出。事实上,编译器将 var1 的类型从 int 隐式提升为 long long

(long long) (var0 * var1)
            ~~~~~~~~~~~~~
                  1
~~~~~~~~~~~~~~~~~~~~~~~~~
           2

在第二个代码中,第一次乘法发生并且结果不适合 long 类型,因此之后的转换不再有帮助。它投射之前溢出的数字。

因此,第一个比第二个更好,以避免溢出。

这完全取决于mid计算结果如何存储:

val = (long long) (var0 * var1); 解释为:

int midResult = (int)var0 * (int)var1;
val = (long long)midResult;

val = (long long) var0 * var1 被解释为:

long long midResult = (long long) var0 * (long long)var1;