我写了一段代码:
int a = 1000000000, b = 1000000000;
long long int ans = a * b;
cout << ans << '\n';
这段代码造成了溢出(overflow)。我知道 a * b 是问题的原因,但是我已经使用了 long long int 变量来存储 a*b。 但请看下面的代码:
int a = 1000000000, b = 1000000000;
long long int ans = (long long int)a * b;
cout << ans << '\n';
它正常工作,没有造成溢出。在计算时,是否会创建临时变量来保存值?请解释这种奇怪的溢出背后的原因。
a * b
被计算为int
(操作数的类型),这并不重要,即使在计算后存储该结果的变量类型更宽。 - Bob__imul
之前或之后(在寄存器中)被扩展。 - Bob__