C 为什么长整数乘法会产生溢出?
我正在用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
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
,这会导致溢出