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

Bha*_*arg 2 c++ type-conversion

我从阅读转换intlong long int正在促销,因此认为不应该有任何问题,因为没有数据丢失,不像反之亦然转换.

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

例如:

int a=1000000, b=1000000;
long long int c=a*b;
cout<<c;
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*eux 7

a*b仍然是类型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;
};
Run Code Online (Sandbox Code Playgroud)


BoB*_*ish 5

乘法正在发生的事情为int,其溢出,给未定义行为(在这种情况下溢出,这是非常正常的-你的编译器+设置甚至会保证它的组合),以及之后的结果被转换为long long.

我想你想乘法之前对其中一个参数进行转换,以便使用long longs 执行乘法运算:

long long c = static_cast<long long>(a)*b;
Run Code Online (Sandbox Code Playgroud)

这样,在乘法发生之前b将被提升long long,并且整个操作将安全地执行,并具有期望的结果.

  • @Adrian Lis用于签名整数,是的 (3认同)