2017-02-22 50 views
2

我读到从intlong long int的转换是促进,因此认为不应该有任何问题,因为没有数据丢失,不同于反之亦然转换。为什么int的int隐式转换为long long int在C++中给出了意想不到的答案?

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

例如:

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

上面的代码给我一个负值。有人能解释为什么吗?

+1

这是因为您使用ints进行操作,导致返回值也是可能溢出的int,然后您的升级已经太晚了。 –

+0

我在C中使用printf中的“%lld”占位符进行打印。即使如此,它也给我带来了负面的价值。 – Bharg

+2

可能是一个重复http://stackoverflow.com/questions/31662792/multiplication-of-two-integers-in-c – Ap31

回答

5

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

我想你想之前乘上做的论据一个转换,使得使用long long秒内未执行乘法:

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

这样,b将晋升为long long前乘法发生,并且整个操作将安全地执行,并且具有期望的结果。

+0

溢出给未定义的行为? –

+3

@Adrian Lis为有符号整数,是 – Ap31

+1

它是为'unsigned int'定义的,但不适用于signed。 – BoBTFish

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; 
}; 
0

由于乘以2 int旨意导致另一个int是附带着所有溢出问题。这int然后(事后)升级到long long int这仍然意味着它不是你想要的。

将至少一个操作数提升为让另一个操作数达到要求的结果。