我想知道是否有任何快速的技巧来进行从 64 位无符号值到 32 位无符号值的饱和转换(如果它被推广到其他宽度会很好,但这是我关心的主要宽度关于)。我在谷歌上搜索到的大部分资源都用于饱和算术运算。
饱和转换将采用 64 位无符号值,如果输入值大于 2^32-1,则将未修改的值返回为 32 位值或 2^32-1。请注意,这不是默认的 C 强制转换截断行为。
我可以想象做类似的事情:
- 测试上半部分是否设置了任何位
- 如果是这样,则创建一个所有位设置的 32 位掩码,否则创建一个所有位未设置的掩码
- 带掩码的按位或下半部分
但我不知道如何快速生成掩码。我在 Godbolt 中尝试了直接的分支实现,看看编译器是否会为我生成一个聪明的无分支实现,但没有运气。
#include <stdint.h>
#include <limits.h>
// Type your code here, or load an example.
uint32_t square(uint64_t num) {
return num > UINT32_MAX ? UINT32_MAX : num;
}
编辑:我的错误,问题是没有设置为使用优化