检查算术运算中的溢出条件

3

我的问题特别涉及无符号整数。 - pravs
严格来说,无符号算术不会溢出;它以一种明确定义的方式进行包装。但这只是关于“溢出”一词含义的小争议,并没有回答你的问题。 - Keith Thompson
1个回答

2

首先检查操作数的大小,然后使用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 */ }

通常无法可靠地在事后检测算术错误,因此必须在执行前进行所有检查。

您可以轻松地将此方法模板化,使其适用于任何数字类型。


你好,有没有一种方法可以使用一些逻辑而不使用任何模板来解决这个问题? - pravs
1
我以为你可以在这之后检测出:a += b; if (a<b) {//overflow},这样可靠吗? - Mooing Duck
1
@pravs:将 std::numeric_limits<unsigned int>::max() 替换为 UINT_MAX - Mooing Duck
@pravs:我的意思是,你大概明白了,但使用numeric_limits无疑是最统一、可读性最好、自解释性最强、最便携的方式。有没有不使用它的理由呢?你也可以问“有没有一种不用类或for循环编写C++的方法”……但为什么要这样做呢? - Kerrek SB
我不了解“numeric_limits”。你能给我一些参考资料吗? - pravs
2
@pravs:我已经添加了一个链接,只需点击即可。否则,阅读任何一本不错的C++书籍以了解更多关于这门语言的知识——我相信FAQ上有一个很好的列表。如果其他方法都失败了,Stroustrup的书总是一个好主意。我还建议你不要围绕“避免任何我还不知道的东西”这个想法来设计你的生活,而是去追求“如何学习做事情更好?”的思路。 :-) - Kerrek SB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接