long long int and = a*b VS long long int and = (long long int) a*b

long long int ans = a*b VS long long int ans = (long long int) a*b

我写了一个代码:

int a = 1000000000, b = 1000000000;
long long int ans = a * b;
cout << ans << '\n';

此代码导致溢出。我知道是 a * b 引起了问题,但我已经使用 long long int 变量来保留 a*b。 但是看看下面的代码:

int a = 1000000000, b = 1000000000;
long long int ans = (long long int)a * b;
cout << ans << '\n';

它工作正常,没有溢出。计算时是否使任何临时变量保存该值?请解释这种奇怪的溢出背后的原因。

这使得 两个 临时变量,(long long int)a(long long int)b。第二次转换是隐式的。

如果硬件有 32*32->64 的乘法运算,实际的编译器可能不会打扰,但正式的转换必须发生。在 64 位硬件上,当您在 64 位寄存器中加载 int 时,它基本上是免费的。