我需要切换字节的顺序,以便 int16 的内容为 (byte1, byte2) -> (byte2, byte1)。我使用联合来做到这一点:
union ConversionUnion
{
uint8_t m_8[4];
uint16_t m_16[2];
uint32_t m_32;
};
//use
uint16_t example = 0xFFDE
ConversionUnion converter;
converter.m_16[0] = example;
std::swap(converter.m_8[0], converter.m_8[1]);
example = converter.m_16[0]; //0xDEFF
现在这确实适用于 gcc,但我被告知这是未定义的行为(gcc 6.3,C++11)。
问题:
1)这真的是未定义的行为吗,我问是因为我以前在嵌入式代码中看到过这个。其他 stackoverflow 问题似乎对此进行了辩论,实际上谁是正确的(对于 C++11 和 C++14)。
2)如果这是未定义的行为,是否可以在不以可移植方式进行大量位移的情况下完成字节顺序交换。我真的很讨厌位移,它非常丑陋。