Swift中整数乘法计算异常:528*2得出1057而非1056的原因
整数乘法计算异常:528*2得出1057的排查方案
问题场景
开发应用生成时间槽时出现多余项,调试发现528 * 2的计算结果为1057(预期应为1056),且所有参与计算的变量均为Int类型。已知totalHours的计算逻辑正确:
let totalHours = dateSelectorList.count * EpgLayoutSize.totalHoursInADay
其中dateSelectorList.count为22,EpgLayoutSize.totalHoursInADay固定为24,因此totalHours = 22*24 = 528的计算无误。
可能的原因及排查步骤
调试器显示偏差
有时调试器的变量视图会出现缓存或显示延迟,实际运行时的计算结果是正确的。可以在乘法操作前后添加打印语句验证真实值:print("totalHours: \(totalHours)") let result = totalHours * 2 print("result: \(result)")对比控制台输出与调试器显示的结果,确认是否是调试器的问题。
变量被意外修改
检查totalHours从计算完成到执行乘法操作之间的所有代码:- 确认
totalHours是否被声明为var而非let(即使代码中写的是let,也要排查是否有同名的var变量覆盖); - 排查是否有异步代码、多线程操作在这段时间内修改了相关变量的值。
- 确认
溢出运算符误用
Swift默认的*运算符会在整数溢出时触发运行时错误,但如果代码中误用了溢出乘法运算符&*,可能会导致计算结果异常。检查乘法操作是否使用了错误的运算符:// 错误示例:使用溢出运算符 let result = totalHours &* 2内存 corruption(极端场景)
如果上述排查都没问题,可能是内存被其他代码意外改写。可以通过打印变量的内存地址,确认totalHours在计算前后是否为同一个对象:withUnsafePointer(to: totalHours) { print("totalHours address: \($0)") }对比计算前后的地址,若地址不一致,说明变量被重新赋值或内存被篡改。
内容的提问来源于stack exchange,提问作者sachuverma
相关产品推荐
相关产品推荐

