我读到从int
到long long int
的转换是促销,因此认为不存在任何问题,因为没有数据丢失,不像反之亦然。
但是当我将两个int
的大值相乘并将其存储在long long int
时,它会显示负数。
例如:
int a=1000000, b=1000000;
long long int c=a*b;
cout<<c;
上面的代码给了我一个负值。有人可以解释原因吗?
答案 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
,这仍然意味着它不是你想要的。
提升至少一个操作数,让另一个提升并得到你想要的结果。