为什么隐式类型转换在此代码中结果不正确

Why does implicit type conversion results incorrectly in this code?

本文关键字:代码 结果 不正确 类型转换 为什么      更新时间:2023-10-16
#include <iostream>
int main()
{
    int number=65536;
    long long temp=number*number;
    std::cout << temp << std::endl;
    return 0;
}

65536的平方显然超出了int的范围。现在,如果我宣布tempint,我就会理解为什么会失败。但即使它是long long,输出总是0的。我相信这与隐式类型转换有些关系,但我不明白为什么结果是0.

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

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

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

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

一种解决方案是编写1LL * number * number以强制将参数提升为long long类型。

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

在运算number*number中,两个操作数都是int。它们不是小整数类型,并且它们都是同一类型,因此不会有隐式提升。乘法将在类型 int 上进行,结果将是 int 型。

您碰巧在之后将结果分配给long根本不影响计算。

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

编译器将

乘法视为两个int变量之间的乘法。它是该乘法的结果,该乘法转换为用于初始化temp变量的long long

乘法的至少一个操作数需要是long long,溢出不会发生。