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

RuD*_*RuD 3 c operator-precedence

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

int var0 = 245895;
int var1 = 478565

long long val = 0;

val = (long long) var0 * var1;
Run Code Online (Sandbox Code Playgroud)

但这件作品给出的结果不正确:

int var0 = 245895;
int var1 = 478565
long long val = 0;

val = (long long) (var0 * var1);
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解释原因吗?

mas*_*oud 9

(long long) var0 * var1
~~~~~~~~~~~~~~~~
       1
~~~~~~~~~~~~~~~~~~~~~~~
           2
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,首先var0转换为long long,之后,乘法的结果将被计算为long long没有溢出.实际上编译器会将var1from 的类型提升longlong long隐式.

(long long) (var0 * var1)
            ~~~~~~~~~~~~~
                  1
~~~~~~~~~~~~~~~~~~~~~~~~~
           2
Run Code Online (Sandbox Code Playgroud)

在第二个代码中,第一个乘法发生,结果不适合一个long类型,因此之后的强制转换不再有用.它抛出之前溢出的数字.

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