【发布时间】:2018-02-28 08:03:40
【问题描述】:
假设我有两个整数x 和y,我想检查它们的总和是否大于UINT_MAX。
#define UINT64T_MAX std::numeric_limits<uint64_t>::max()
uint64_t x = foo();
uint64_t y = foo();
bool carry = UINT64T_MAX - x < y;
该代码可以工作,但我想知道是否有更有效的方法来做到这一点 - 可能使用 CPU 具有的一些鲜为人知的功能。
【问题讨论】:
-
数值有什么限制吗?最小/最大?任何事物? (如果是这样,您可能会将其降低为 1 个比较)在一般情况下,减法还不错,也许您可以使用位掩码来确定两个数字 ANDED 一起是否会创建 UINT64T_MAX,按位运算非常便宜,但我不'不知道 AND 会正确解释溢出。
-
标题写着
unsigned ints 和uint_max,但代码写着uint64_t。你到底是什么意思? -
如果有一个“鲜为人知的 CPU 特性”,那么你的编译器应该知道它
-
@M.M 没错,但编译器并不神奇——您确实需要“不阻止”它们应用任何给定的优化。参见“好像”规则。
标签: c++ integer unsigned-integer