为什么隐式类型转换在此代码中导致错误?

时间:2017-03-15 12:52:02

标签: c++ types

#include <iostream>

int main()
{
    int number=65536;
    long long temp=number*number;
    std::cout << temp << std::endl;
    return 0;
}

65536的平方明显超出int的范围。现在,如果我已将temp声明为int,我会理解为什么会失败。但即使它是long long,输出也总是0。我相信这与隐式类型转换有些相关,但我无法理解为什么结果是0

这是因为c ++根本不允许将int转换为long吗?如果是这样,那为什么这个数字较小?

3 个答案:

答案 0 :(得分:10)

(请注意,int的范围可以小到-32767到+32767。)

number * numberint算术中计算,因为两个参数都是int类型。由于int溢出,您的程序行为未定义

您希望将结果分配给long long这一事实无关紧要。

一种解决方案是编写1LL * number * number以强制推广long long类型的参数。

答案 1 :(得分:3)

用于操作的类型取决于该操作使用的操作数

在操作number*number中,两个操作数均为int。它们不是小整数类型,它们都是相同的类型,因此不会有隐式提升。乘法将在int类型上执行,结果将为int类型。

之后您碰巧将结果分配给long并不会影响计算。

解决方案是将一个或两个操作数强制转换为足以保存计算结果的类型。

答案 2 :(得分:2)

编译器将乘法视为两个int变量之间的乘法。该乘法的结果转换为long long以初始化temp变量。

乘法的至少一个操作数需要为long long才能发生溢出。