为什么隐式类型转换在此代码中结果不正确
Why does implicit type conversion results incorrectly in this code?
#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
吗?如果是这样,那么为什么这适用于较小的数字?
(请注意,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
,溢出不会发生。
相关文章:
- 这两个代码片段相似,但显示的结果不同
- 为什么第二个代码给出了预期的结果,而第一个代码却没有?
- RapidXML - 代码创建意外结果
- 代码未在联机编译器上显示结果
- 为什么这两段使用 constexpr、__PRETTY_FUNCTION__ 和 char * 的代码有不同的结果?
- C++位移位在相反方向上具有相同的常量,结果不同,代码更改很小
- 我的代码厨师提交显示错误的结果
- 如何查找导致结果不一致的代码
- 如何使用 c++ 将股票代码的结果添加到 poloniex 中的数组中?
- 我无法弄清楚我的代码未显示预期结果的问题
- 为什么这段代码(在 Matlab 的 MEX 文件中使用 OpenMP)给出不同的结果?
- 为什么这两个相似的代码计算行列式的结果不同?
- 为什么这个C++程序在代码::块和在线 IDE 之间返回不同的结果?
- C++:汇编代码包含断言结果
- 有人可以解释一下'sizeof'在此代码中返回的结果吗
- 相同的代码在联机 IDE 和本地 IDE 中给出不同的结果
- 如何在C 中为文本文件编写代码结果(在void函数之内)
- 我的代码结果为零,我不知道为什么
- 当我尝试输入时,我的代码结果为0
- 数组大小会影响代码结果