【问题标题】:Overflow number detection溢出数检测
【发布时间】:2016-02-20 04:22:59
【问题描述】:

情况:

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

  • 这些数字都是
  • 一些数字是溢出算术运算的结果:因此这些数字在流中将是负数。

问题:

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

【问题讨论】:

  • 您有关于这些数字的任何其他信息/统计数据吗?比如分布、max/min、p99等?
  • 我掌握的信息是数字是 32 位数字,范围为 2147483647 到 -2147483647。这些是单数整数。
  • 根据您提供的信息 - 没有办法(我在回答中列出了一些选项,如果您没有这些限制,可能会有所帮助)。请注意,如果这是面试问题,可能是您需要查询的其他一些信息,这将允许特定类型的过滤。

标签: c# math integer overflow


【解决方案1】:

在一般情况下无法实现您想要的。没有关于int(或任何其他内置值类型)如何生成的信息。正则运算或溢出得到的值的二进制模式没有区别。

您的选择:

  • 某些情况可以通过范围检查来检测 - 如果正常值相对较小,一些较大的值可能会出错
  • 构造值流时捕获更多信息 - 包括“溢出”标志作为值对
  • 对值使用更宽的类型(longBigInteger

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

【讨论】:

  • 感谢 Alexei 的回答,如果溢出的数字在数字行 -2147483647........ 0...... ....2147483647。只是愚蠢的想法
  • @Sandeep 进位标志仅在操作后立即存在于 CPU 级别,它不存储在任何地方,并且在下一个 CPU 级别命令后大致失去有效性。 32位整数也没有空间来存储它。
【解决方案2】:

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

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

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

【讨论】:

  • 数字已经溢出,无法控制我可以更改的数字来源
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
相关资源
最近更新 更多