某些语言(如 Rust、Zig、GLSL、HLSL)具有内置方法,可根据作为无符号整数提供的位构建浮点类型。然而,C 和 C++ 没有这方面的标准函数。
在 C99 中,我们可以使用带有成员初始化的匿名联合来实现类型双关宏,以达到相同的效果:
#define FLOAT_FROM_BITS(U,F,b) (((union{U u; F f;}){.u=(b)}).f)
#define FLOAT32_FROM_BITS(i) FLOAT_FROM_BITS(uint32_t, float, i)
#define FLOAT64_FROM_BITS(i) FLOAT_FROM_BITS(uint64_t, double, i)
Run Code Online (Sandbox Code Playgroud)
随后可以使用它来初始化 const / static。在 C++ 中执行此操作最优雅的方法是什么,以便它也可以用于静态初始化?
如果你可以使用C++20或更高版本,那么使用std::bit_castlike
auto myvar = std::bit_cast<type_to_cast_to>(value_to_cast);
Run Code Online (Sandbox Code Playgroud)
如果您想支持旧版本,可以使用std::memcpy将字节从一种类型复制到另一种类型来执行相同的操作。这会给你一个像这样的函数
template <class To, class From>
To bit_cast(const From& src)
{
To dst;
std::memcpy(&dst, &src, sizeof(To));
return dst;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
134 次 |
| 最近记录: |