交换浮子和双打的"endianness"

swapping "endianness" of floats and doubles

本文关键字:endianness 交换      更新时间:2023-10-16

我想切换浮点数和双精度值的"端序",它工作正常,通过这样做:

float const v{1.f};
swap(reinterpret_cast<::std::uint32_t const&>(v));

有没有更好的方法来做交换,而不需要强制转换?

编辑:swap()是gcc内置函数的c++包装器,我在这里没有包括它。

uint16_t __builtin_bswap16 (uint16_t x)
uint32_t __builtin_bswap32 (uint32_t x)
uint64_t __builtin_bswap64 (uint64_t x)

对于某些数据格式,如cor,需要交换端序

虽然尽量避免强制转换是一种良好的做法,但是这种用法正是强制转换存在的原因。端序交换是一种原始数据操作,因此为了做到这一点,您必须剥离键入信息,我想说的是,如果它开始时不是正确的端序,那么它就不是浮点数,并且在错误的端序状态下永远不应该以这种方式键入。

简单地交换字节顺序就足够了。将浮点数内存化为char val[4],创建一个虚拟char rvrse[4],然后设置;Rvrse [3] = val[0];Rvrse [2] = val[1];…然后内存反转回原来的浮动。最好的方法是编写一个类似于ntohl的函数,但使用模板使其适用于所有类型。