我需要递归计算树下由无符号整数表示的整数。每个节点都与一个整数值相关联,该整数值通过将其子节点的数字相乘而递归计算得出。每个叶子都有一个未计算的静态数字,每个数字都大于 0。
问题是频繁溢出。实际上,当结果很大时我并不感兴趣。如果我得到的结果只是告诉我值是 > 就没问题了SOME_BIG_VALUE
(在这种情况下我不需要真实值)。
我的想法是使用值 0(否则永远不会使用)作为任何“高数字”的约定,并且
//when multiplying a and b each being <= SOME_BIG_VALUE, there is no overflow
unsigned c = a*b;
// add a check
if (c > SOME_BIG_VALUE)
c = 0;
定义 SOME_BIG_VALUE 及其最高可能值以避免溢出的最干净的方法是什么?
我考虑使用以下定义:
#DEFINE SOME_BIG_VALUE unsigned(sqrt(UINT_MAX));
但它看上去有点脏,不是吗?
我知道在大多数情况下,无符号数用 32 位或 64 位表示,但我不确定这是否保证。如果是,我可以检查我们处于哪种配置中,并SOME_BIG_VALUE
分别创建 2^16-1 或 2^32-1 的定义。