C++算术运算中强制类型转换(Typecasting)的具体行为咨询
C++代码中强制类型转换的行为疑问
代码片段:
int x1 = extRes1.at(1).toInt(); // 取值为较大的int,来自Qt的QStringList,返回值为int类型 int x2 = extRes2.at(1).toInt(); int y1 = extRes1.at(2).toInt(); int y2 = extRes2.at(2).toInt(); double c = (double)(y2*x1-y1*x2)/(x1-x2); // 强制类型转换,期望得到浮点运算结果
核心疑问:
第5行的强制类型转换具体行为是什么?是将运算中的所有元素(如y2、x1)转为double,还是仅转换括号内的最终运算结果?
解答:
当前代码的转换行为:
强制类型转换(double)仅作用于括号内的整体结果——也就是先以int类型完成y2*x1 - y1*x2的运算,得到一个int值后,再将这个值转换为double类型。之后进行除法运算时,因为除数x1-x2是int类型,会被隐式转换为double,最终得到double类型的结果。潜在问题:
因为x1、y2等是较大的int值,y2*x1这类乘法运算很容易超出int的取值范围,引发整数溢出,导致括号内的运算结果本身就是错误的,后续转成double也无法修正这个错误。正确的写法:
要避免溢出并保证整个运算以浮点类型进行,应该提前将参与乘法的变量转为double,比如:double c = ( (double)y2 * x1 - (double)y1 * x2 ) / (x1 - x2);这样每个乘法运算都会先以double类型执行,从根源上避免整数溢出,同时整个表达式的运算结果自然是double类型。
内容的提问来源于stack exchange,提问作者HFOrangefish
相关产品推荐
相关产品推荐

