从长整整转换为uint64_t的推荐方法是什么?

What is the recommended way to convert from long long int to uint64_t?

本文关键字:方法 是什么 转换 uint64      更新时间:2023-10-16

考虑一个返回long long int值的函数。即使它返回一个long long int,逻辑保证它总是正数。我想使用分配给uint64_t的返回值。鉴于逻辑正确,推荐的转换方法是什么?我应该只分配给它还是进行静态转换?

这是一个隐式转换,积分转换,不需要强制转换:

如果目标类型为无符号,则结果值为等于源值模 2n 的最小无符号值 其中 n 是用于表示目标类型的位数。 也就是说,根据目标类型是宽还是窄,有符号整数分别是符号扩展或截断,无符号整数分别是零扩展或截断。

static_cast不会增加任何价值。

static_assert可用于防止截断,例如:

static_assert(sizeof(uint64_t) >= sizeof(long long), "Truncation detected.");`

还有boost::numeric_cast

对于

所有转换(上述无符号到无符号的转换除外(,溢出行为都是未定义的,这一事实使得任何可能产生正溢出或负溢出的代码都暴露在可移植性问题面前。

numeric_cast返回将 Source 类型的值转换为 Target 类型的值的结果。如果检测到超出范围,则会执行溢出策略,其默认行为是引发异常(请参阅bad_numeric_castnegative_overflowpositive_overflow(。