【问题标题】:Check for overflow condition in an arithmetic operation [duplicate]检查算术运算中的溢出条件[重复]
【发布时间】:2011-10-28 16:53:54
【问题描述】:

可能重复:
Best way to detect integer overflow in C/C++

我们如何检查诸如加法、乘法或减法之类的算术运算是否会导致溢出?

【问题讨论】:

  • 我的问题是专门针对无符号整数的
  • 严格来说,无符号算术不会溢出;它以明确定义的方式环绕。但这只是对“溢出”一词含义的狡辩,并不能回答您的问题。

标签: c++ c


【解决方案1】:

首先检查操作数的大小,然后使用std::numeric_limits。例如,对于加法:

#include <limits>

unsigned int a, b;  // from somewhere

unsigned int diff = std::numeric_limits<unsigned int>::max() - a;

if (diff < b) { /* error, cannot add a + b */ }

您无法在事后普遍且可靠地检测算术错误,因此您必须在事前进行所有检查。

您可以轻松地对这种方法进行模板化,使其适用于任何数字类型。

【讨论】:

  • 您好,请问有什么方法可以使用一些逻辑,不使用任何模板来解决这个问题吗?
  • 我以为你可以检测到:a += b; if (a&lt;b) {//overflow},还是这不可靠?
  • @pravs:将std::numeric_limits&lt;unsigned int&gt;::max() 替换为UINT_MAX
  • @pravs:我的意思是,你明白了一般的想法,但使用numeric_limts 是迄今为止最统一、可读、不言自明和可移植的方式。有什么理由使用它吗?你也可以说“有没有办法在没有类或 for 循环的情况下编写 C++”......但是为什么呢?
  • @pravs:我确实添加了一个链接,只需单击它。否则,请阅读任何不错的 C++ 书籍以了解有关该语言的更多信息——我相信常见问题解答中有一个很好的列表。如果一切都失败了,Stroustrup 的书总是一个好主意。我还建议你不要围绕“避免任何我还不知道的事情”的想法来设计你的生活,而应该去“我如何学习如何更好地做事?”。 :-)
猜你喜欢
  • 2010-12-28
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
相关资源
最近更新 更多