C++ 交换;endianness“;花车和双人

C++ 交换;endianness“;花车和双人,c++,floating-point,C++,Floating Point,我想切换float和double值的“endianness”,它可以正常工作,方法如下: float const v{1.f}; swap(reinterpret_cast<::std::uint32_t const&>(v)); 对于某些数据格式,如CBOR,需要交换endianess。虽然尝试避免强制转换是一种很好的做法,但正是这样的使用才是强制转换存在的原因。endian交换是一种原始数据操作,因此,为了进行此操作,您必须去除键入信息,我想说的是,如果一开始它不是e

我想切换float和double值的“endianness”,它可以正常工作,方法如下:

float const v{1.f};

swap(reinterpret_cast<::std::uint32_t const&>(v));

对于某些数据格式,如CBOR,需要交换endianess。

虽然尝试避免强制转换是一种很好的做法,但正是这样的使用才是强制转换存在的原因。endian交换是一种原始数据操作,因此,为了进行此操作,您必须去除键入信息,我想说的是,如果一开始它不是endian正确的,那么它就不是浮点,并且在错误的endian状态下不应该以这种方式键入。

这不会交换任何内容。事实上,我很确定这是不可编译的。IEEE不包括endianness,但实际上,您可能会假设它与integer的工作方式相同。所以是的,它很难看,但它通过铸造工作。假设sizeof(float)==sizeof(uint32\u t)@Christophe static\u assert可以帮助实现这一点。这不违反类型别名规则吗?GCC对此表示不满,因为设置了
-Wall
,就像您将
float*
投射到
uint32\u t*
并访问它一样。IIRC,进行此类操作的唯一安全方法是通过字节表示
memcpy()
将浮点数转换为uint32\t并交换该浮点数。
memcpy()
无论如何都应该得到优化。
uint16_t __builtin_bswap16 (uint16_t x)
uint32_t __builtin_bswap32 (uint32_t x)
uint64_t __builtin_bswap64 (uint64_t x)