溢出数检测

时间:2016-02-20 04:23:00

标签: c# math integer overflow

情况:

我有一个读取连续数字流的系统(仅限整数)。

  • 这些数字都是正面负面
  • 有些数字是溢出算术运算的结果:所以这些数字在流中是负数。

问题:

如何区分流中的溢出负数和非溢出负数?有没有办法找到并丢弃溢出的数字?我正在使用C#进行开发,并且无法控制流源。所以我无法更改代码或添加任何检查。

2 个答案:

答案 0 :(得分:4)

在通用案例中无法达到您想要的效果。在int(或任何其他内置值类型)的生成方式上没有关于long(或任何其他内置值类型)的信息。通过常规操作或溢出获得的二进制模式没有区别。

您的选择:

  • 某些情况可能会通过范围检查来检测 - 如果正常值相对较小,则某些大值可能是错误
  • 构建值流时捕获更多信息 - 将“溢出”标志包含为值
  • 对值(BigIntegerstatic int count; private static boolean isGreaterThan(int i, int j) { count++; return i > j; }
  • 使用更宽的类型

请注意,溢出也会产生小数/正数,因此除非您了解有关如何执行计算的更多信息,否则不会过滤所有无效值。

答案 1 :(得分:0)

您可以编写防御性代码以防止溢出。

所有内置数字类型都有MinValueMaxValue属性

if (number >= Int32.MinValue && number <= Int32.MaxValue)
{
     // logic
}
相关问题