如何解决C++ 中的中间 static_cast 有影响吗?没有它,代码似乎运行良好
#include <iostream>
using namespace std;
int main()
{
int intvar = 1500000000; //1,500,000,000
intvar = (intvar * 10) / 10; //result too large
cout << "intvar = " << intvar << endl; //wrong answer
intvar = 1500000000; //cast to double
intvar = (static_cast<double>(intvar) * 10) / 10;
cout << "intvar = " << intvar << endl; //right answer return 0;
return 0;
}
我期望的输出是这样的: 内部变量 = 211509811 intvar = 1500000000
输出: 内部变量 = 1500000000 intvar = 1500000000
解决方法
为什么两次输出相同?
如果您对代码片段进行 look at this 编译,您可以看到相关行(intVar = (intVar * 10) / 10;
,输入中的第 6 行)已被完全删除。正如 Richard Critten 在评论中提到的那样,编译器在未定义行为(有符号溢出)的情况下这样做是完全合法的。
换句话说:因为这行代码导致未定义的行为,编译器将其删除并且永远不会执行。正如您期望在此行前后 intVal
中的值相同,您从未注意到它实际上已被删除。
供将来参考的图像:
在标题中详细说明您的实际问题:
C++ 中的中间 static_cast 有影响吗?
是的,正如您在代码片段中所见,转换为 double
允许 CPU 使用浮点数的 IEEE 754 标准执行计算。这些数字不太精确(存在舍入误差),但允许的值范围更广。在您的情况下,CPU 会:
- 将
int
转换为double
- 将其乘以
10
,结果为 1.5e10(大于 maximumint
2,147,483,647) - 将其除以
10
,结果为 1.5e9(再次适合 32 位int
) - 将其转换回
int
(由于intVar
的类型而隐式)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。