【发布时间】:2014-03-05 05:44:10
【问题描述】:
假设我有数据,如下所示:
union
{
struct
{
char flags : 4;
uint16_t : 12;
}
char data[2];
}
我了解如何使此代码在平台上不受字节字节序的影响而运行。我要求确保我对如何将其存储在不同字节序上的理解是正确的。
据我了解: 如果我将 uint16 存储在 12 位 uint 中,则两个字节序都会丢弃 4 个最高位。 Big-endian 会将剩余的 4 个高位存储在与标志相同的字节中,其余的存储在单独的字节中。 Little-endian 会将最低 4 位存储在与标志相同的字节中,其余的则存储在单独的字节中。
这样对吗?
【问题讨论】:
-
C++规范试图定义和提供一种逻辑正确的语言,而不是一种对bit正确的语言;如果这对你有某种意义。换句话说,C++不关心也不指定在位级别使用的信息的表示,这与您无法将float推断为模板参数的原因类似,C++没有为float的表示提供定义,因此它甚至不能提供一些对模板必不可少的基本保证。这一切都是编译器和 ABI 特定的。
标签: c++ struct endianness unions