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
时,它基本上是免费的。
我写了一个代码:
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
时,它基本上是免费的。