以下是为我提出上述疑问的计划。
#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;
答案 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
。