截断整数的好方法

Nice way to truncate an integer

本文关键字:方法 整数      更新时间:2023-10-16

我有一个函数,它被赋予了一个缓冲区,该缓冲区接受填充到size_t长度;但是,填充它的实际调用需要int作为最大长度。

因此,如果参数无法容纳整数,我希望将其截断为可以容纳的最大值; 因为我无论如何都无法获得更多数据。

我可以做到

int truncatedMaxLen = static_cast<int>(std::min<std::size_t>(maxLength, (std::numeric_limits<int>::max)()));

还有什么不那么丑陋的方式吗?

无分支的方式是:

int truncatedMaxLen = maxLength;
truncatedMaxLen |= (truncatedMaxLen < maxLength) * std::numeric_limits<int>::max();

对于无符号类型,它更好,因为没有符号位需要处理:

unsigned truncatedMaxLen = maxLength;
truncatedMaxLen |= -(truncatedMaxLen < maxLength);