在 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;
下面的代码给出了乘法的正确结果
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;