gpt4 book ai didi

c++ - 检查两个无符号整数之和是否大于 uint_max

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:17:21 24 4
gpt4 key购买 nike

假设我有两个整数xy,我想检查它们的和是否大于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 具有的一些鲜为人知的功能。

最佳答案

在 C++ 中,无符号整数溢出具有明确定义的行为。如果将两个无符号整数相加并且结果小于其中任何一个,则计算溢出。 (结果总是比两者都小,所以你检查哪一个都没有关系。)

#define UINT64T_MAX std::numeric_limits<uint64_t>::max()

uint64_t x = foo();
uint64_t y = foo();
uint64_t z = x + y;
bool carry = z < x;

我相信这是在可移植、定义明确的 C++ 中实现此目的的最佳方式。 Clang 和 GCC 都将这个简单的示例编译为两个 amd64 指令的最佳序列(add x, y; setc carry)。

不会泛化为有符号整数溢出,因为有符号整数溢出是未定义的行为(尽管 some C++ committee members are looking to change that )。

一些编译器提供 non-standard ways to check for overflow在各种算术函数之后,不仅仅是加法,也不仅仅是有符号数。如果您能承受失去便携性,那么将它们用于该附加功能可能值得研究。对于无符号加法溢出的特定情况,在某些重要情况下性能可能相同或快得可以忽略不计,可能不值得失去可移植性。

关于c++ - 检查两个无符号整数之和是否大于 uint_max,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49024647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com