为什么long long和int相乘会导致溢出?

3

我在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

我不理解为什么更改相乘的变量顺序会导致溢出。

1个回答

4
在这种情况下,结合性是从左到右的,所以会发生以下情况:
  var1 = (n * x) * x;
  var2 = (x * x) * n;

对于 n * x,由于 nlong long 类型,所以它拥有更高的转换级别,因此 x 会被转换为 long long。因此,这个部分结果不会溢出。

但是对于 x * x,两个操作数都是 int 类型,因此结果也将是 int,而无法存储值为 2,500,000,000 的数据,从而导致溢出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接