为何12303与174596相乘触发OverflowException?如何解决?
解决VB.NET中整数乘法溢出的问题
这个问题我遇过好几次了,核心原因就是整数类型的溢出限制——咱们一步步拆解来看:
为什么会触发OverflowException?
先算一下你提到的两个数的乘积:12303 * 174596 = 2147975588。而VB.NET里的Integer类型(32位有符号整数)的最大值是2147483647,你的乘积刚好超出了这个上限一点点,所以当两个Integer类型的变量相乘时,.NET会严格检查溢出(尤其是在默认的溢出检查开启状态下),直接抛出OverflowException。
看你的代码:
Dim position As Long = hisFileHeader.StreamStartDataPosition + (TSIdx * hisFileHeader.StreamDataBlockSize)
这里TSIdx和hisFileHeader.StreamDataBlockSize应该都是Integer类型,所以乘法运算会先以Integer类型执行,结果溢出后直接报错,哪怕最终要赋值给Long类型也没用——因为溢出发生在乘法步骤。
怎么解决?
解决思路很简单:让乘法运算在更大的整数类型(Long,64位有符号整数)下执行,这样就不会超出范围了。你只需要把其中一个操作数强制转换为Long类型,.NET就会自动把整个乘法运算提升为Long类型计算:
方案1:转换TSIdx为Long
Dim position As Long = hisFileHeader.StreamStartDataPosition + (CLng(TSIdx) * hisFileHeader.StreamDataBlockSize)
方案2:转换StreamDataBlockSize为Long
Dim position As Long = hisFileHeader.StreamStartDataPosition + (TSIdx * CLng(hisFileHeader.StreamDataBlockSize))
进阶方案:从根源避免
如果你的业务场景中这类数值可能经常接近或超过Integer上限,建议直接把TSIdx和StreamDataBlockSize的类型声明为Long,这样后续所有运算都不会再出现这类溢出问题。
另外,推荐在项目中开启Option Strict On,它会强制你进行显式的类型转换,避免很多隐式转换带来的潜在问题。
内容的提问来源于stack exchange,提问作者Siebe Bosch
相关产品推荐
相关产品推荐

