溢出号码检测
Overflow number detection
情况:
我有一个系统可以读取连续的数字流(仅限整数)。
- 数字都是正和负。
- 一些数字是溢出算术运算的结果:所以这些数字在流中将是负数。
问题:
如何区分流中溢出的负数和非溢出的负数?有没有办法找到并丢弃溢出的数字?我在 C# 中开发,无法控制流源。所以我无法更改代码或添加任何检查。
您可以编写防御代码来防止溢出。
所有内置数值类型都具有 MinValue
和 MaxValue
属性
if (number >= Int32.MinValue && number <= Int32.MaxValue)
{
// logic
}
在一般情况下无法实现您想要的效果。关于 int
(或任何其他内置值类型)的生成方式,没有任何信息。正则运算或溢出得到的值的二进制模式没有区别。
您的选择:
- 有些情况可以通过范围检查来检测 - 如果正常值相对较小,一些较大的值可能是错误的
- 在构造 值流时捕获更多信息 - 将 "overflow" 标志作为对值
- 对值使用更宽的类型(
long
或 BigInteger
)
请注意,溢出也会产生小的 number/positive 数字,因此除非您了解有关如何执行计算的更多信息,否则无法过滤所有无效值。
情况:
我有一个系统可以读取连续的数字流(仅限整数)。
- 数字都是正和负。
- 一些数字是溢出算术运算的结果:所以这些数字在流中将是负数。
问题:
如何区分流中溢出的负数和非溢出的负数?有没有办法找到并丢弃溢出的数字?我在 C# 中开发,无法控制流源。所以我无法更改代码或添加任何检查。
您可以编写防御代码来防止溢出。
所有内置数值类型都具有 MinValue
和 MaxValue
属性
if (number >= Int32.MinValue && number <= Int32.MaxValue)
{
// logic
}
在一般情况下无法实现您想要的效果。关于 int
(或任何其他内置值类型)的生成方式,没有任何信息。正则运算或溢出得到的值的二进制模式没有区别。
您的选择:
- 有些情况可以通过范围检查来检测 - 如果正常值相对较小,一些较大的值可能是错误的
- 在构造 值流时捕获更多信息 - 将 "overflow" 标志作为对值
- 对值使用更宽的类型(
long
或BigInteger
)
请注意,溢出也会产生小的 number/positive 数字,因此除非您了解有关如何执行计算的更多信息,否则无法过滤所有无效值。