在评估C表达式时,临时结果存储在哪里?

时间:2012-03-05 06:21:45

标签: c

以下是为我提出上述疑问的计划。

#include <stdio.h>
int main() { 
    int g = 300000*300000/300000;
    printf("%d",g);
    return 0;
}

评估*时,结果为90000000000。然后除以300000。 我希望第一个表达式结果存储在某处,然后除以300000。因此输出为300000

但它给了我-647。 这是否意味着它被评估为:

g = 300000*300000;
g = g / 300000;

2 个答案:

答案 0 :(得分:4)

无论存储在何处,它仍然是int类型。假设您的计算机上int是32位,那么您将获得300000*300000的整数溢出。

300000*300000 -> 90000000000 -> -194313216  (integer overflow)
-194313216 / 300000 -> -647

基本上,临时(或中间人)不会神奇地让你绕过溢出。


*请注意,有符号整数溢出在技术上是未定义的行为。但在这种情况下,它恰好以你期望的方式包裹着。

答案 1 :(得分:2)

两个3000000都是int类型,因此尝试将结果匹配到int中。这导致寄存器溢出。之后的/ 300000不再有用了。

您可以使用3000000ll作为其中一个因素,使其成为long long