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)
有人可以帮我解释原因吗?
(long long) var0 * var1
~~~~~~~~~~~~~~~~
1
~~~~~~~~~~~~~~~~~~~~~~~
2
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,首先var0转换为long long,之后,乘法的结果将被计算为long long没有溢出.实际上编译器会将var1from 的类型提升long为long long隐式.
(long long) (var0 * var1)
~~~~~~~~~~~~~
1
~~~~~~~~~~~~~~~~~~~~~~~~~
2
Run Code Online (Sandbox Code Playgroud)
在第二个代码中,第一个乘法发生,结果不适合一个long类型,因此之后的强制转换不再有用.它抛出之前溢出的数字.
因此,第一个比第二个好,以避免溢出.
| 归档时间: |
|
| 查看次数: |
937 次 |
| 最近记录: |