Box类CalculateVolume成员函数大数乘法计算错误原因排查
问题原因分析
核心问题:整数溢出的时机差异
你遇到的问题本质是有符号整数溢出导致的未定义行为,具体差异在于乘法运算的类型转换时机:- 成员函数
CalculateVolume里的逻辑应该是直接用三个int类型的变量相乘,比如:
32位有符号long long CalculateVolume() { return length * width * height; // 三个int先相乘,结果还是int,溢出后再转long long }int的最大值是2147483647,而你的目标结果33004122803远大于这个值,所以三个int相乘时会直接溢出——溢出后的数值会触发回绕表现为负数(这是常见溢出后的现象,但属于C++标准中的未定义行为),之后再把这个错误的负数转换为long long,就得到了-1355615565。 - 而你在
main函数里是先把每个int转换为long long再相乘:
这里第一个long long volume = (long long)length * width * height;int被转成long long后,后续的乘法运算都会以long long类型执行,整个计算过程不会溢出,自然得到正确结果。
- 成员函数
修复验证方式
你可以把成员函数里的乘法改成先对其中一个变量做long long强制转换,比如:long long CalculateVolume() { return (long long)length * width * height; }这样就能保证乘法运算从一开始就以
long long类型执行,彻底避免溢出问题。
内容的提问来源于stack exchange,提问作者Dig The Code
相关产品推荐
相关产品推荐

