【发布时间】:2011-10-28 16:53:54
【问题描述】:
【问题讨论】:
-
我的问题是专门针对无符号整数的
-
严格来说,无符号算术不会溢出;它以明确定义的方式环绕。但这只是对“溢出”一词含义的狡辩,并不能回答您的问题。
【问题讨论】:
首先检查操作数的大小,然后使用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<b) {//overflow},还是这不可靠?
std::numeric_limits<unsigned int>::max() 替换为UINT_MAX
numeric_limts 是迄今为止最统一、可读、不言自明和可移植的方式。有什么理由不使用它吗?你也可以说“有没有办法在没有类或 for 循环的情况下编写 C++”......但是为什么呢?