为什么将int隐式转换为long long int会在C ++中给出意想不到的答案?

时间:2017-02-22 16:18:52

标签: c++ type-conversion

我读到从intlong long int的转换是促销,因此认为不存在任何问题,因为没有数据丢失,不像反之亦然。

但是当我将两个int的大值相乘并将其存储在long long int时,它会显示负数。

例如:

int a=1000000, b=1000000;
long long int c=a*b;
cout<<c;

上面的代码给了我一个负值。有人可以解释原因吗?

3 个答案:

答案 0 :(得分:7)

int仍为long long int类型。评估完成后,结果然后转换为long long int。那时为时已晚,无法避免溢出。在执行乘法之前,将其中一个值转换为#include <iostream> using std::cout; int main() { int a = 1000000, b = 1000000; long long int c = static_cast<long long int>(a)*b; cout << c; return 0; }; 。试试这个:

labels

答案 1 :(得分:5)

乘法发生在int,溢出,给出Undefined Behaviour(在这种情况下溢出,这是非常正常的 - 你的编译器+设置的组合甚至可以保证它),和之后,结果将转换为long long

我认为您希望在乘法之前对其中一个参数进行转换,以便使用long long执行乘法运算:

long long c = static_cast<long long>(a)*b;

通过这种方式,b将在乘法发生之前被提升为long long,整个操作将安全地执行,并具有所需的结果。

答案 2 :(得分:0)

因为将两个int相乘会导致另一个int附带所有溢出问题。这个int然后(事后)被提升为long long int,这仍然意味着它不是你想要的。

提升至少一个操作数,让另一个提升并得到你想要的结果。