uint12结构中的字节序

时间:2014-03-05 05:44:10

标签: c++ struct endianness unions

假设我有数据,如下所示:

union
{
  struct
  {
    char flags : 4;
    uint16_t   : 12;
  }
  char data[2];
}

我理解如何在平台上运行此代码而不管字节字节顺序。我要求确保我对如何存储在不同端序上的理解是正确的。

据我所知: 如果我要在12位uint中存储一个uint16,那么两个endians都将丢弃4个最高位。 Big-endian将剩余的4个高位存储在与标志相同的字节中,其余的存储在单独的字节中。 Little-endian会将4个最低位存储在与标志相同的字节中,其余位则存储在单独的字节中。

这是对的吗?

1 个答案:

答案 0 :(得分:1)

这取决于编译器和目标平台的ABI。见,例如, GCC bit-fields的规则:单位中位域分配的顺序是由ABI确定。此外,每个字段都应声明为intunsigned int,而不是uint16_t

如果要控制数据格式,可以使用移位和屏蔽将数据组合为uint16_t。如果您的目标是以明确定义的格式写出数据,则可以在所需的字节顺序中写入uint16_t字节,或者只将数据组合成2个字节并按所需顺序写入。

除非你找到承诺你想要的语言规范文档,否则你的编译器文档明确承诺并且你对大端和小端的CPU使用相同的编译器,不要依赖C / C ++编译器来做所有事情像这样一样。