C 为什么长整数乘法会产生溢出?

C 为什么长整数乘法会产生溢出?,c,type-conversion,C,Type Conversion,我正在用c语言测试这段代码 long long n = 1000000; long long var1,var2; int x = 50000; var1 = n * x * x; var2 = x * x * n; printf("var1 = %lld\n", var1); printf("var2 = %lld\n", var2); 当我运行它时,它产生这个输出 var1 = 2500000000000000 var2 = -1794967296000000

我正在用c语言测试这段代码

  long long n = 1000000;
  long long var1,var2;
  int x = 50000;
  var1 = n * x * x;
  var2 = x * x * n;
  printf("var1 = %lld\n", var1);
  printf("var2 = %lld\n", var2);
当我运行它时,它产生这个输出

var1 = 2500000000000000
var2 = -1794967296000000

我不明白为什么更改变量相乘的顺序会产生溢出。

在这种情况下,关联性是从左到右的,因此发生的情况是:

  var1 = (n * x) * x;
  var2 = (x * x) * n;
n*x
的情况下,
x
将被转换为
long
,因为
n
long
,所以它具有更高的转换等级。因此,此部分结果不会溢出

但是对于
x*x
,两个操作数都是
int
,因此结果也将是
int
,并且不能保存值
2500000000
,这会导致溢出