【问题标题】:How to make 4 bytes using bit field struct and union?如何使用位域结构和联合制作 4 个字节?
【发布时间】:2018-08-15 07:46:03
【问题描述】:

这里是代码。

struct test {
    struct abc {
        int a : 24;
        union b {
            int b1 : 10;
            int b2 : 14;
        };
    };
    int c : 8;
};

我想将结构 abc 设置为 3 字节大小,再加上一个额外的 1 字节大小变量以生成 4 字节结构。但是,由于内部结构实际上显示为 4 个字节,而结构测试的总大小为 5 个字节。

我使用的是 Visual Studio 2017 版本。 (而且我也已经使用了打包选项)

如何将结构调整为 4 个字节?这是在已经在使用的代码中发现的一个错误,因此依赖关系太大,以至于我无法更改变量的顺序或在其中创建新结构。

【问题讨论】:

  • 大小test: 4
  • 创建 5 个字节的结构没有意义,根据编译器标志,填充到 4 或 8 会丢失。
  • 是的,b1b2 重叠,因为 union,占用相同的 14 位。
  • 不可能联合最少 2 个字节加上 3 个字节字段a
  • int c : 8; 是 4 个字节(我假设在您的平台上 sizeof(int) 是 4)。即使明确省略,隐含的int : 24 余数仍然存在。 Binghe Zhai 的答案很有效,因为 byte 是 8 位(可能因平台而异,我再次假设)。

标签: c++ visual-studio-2017 unions bit-fields


【解决方案1】:
#pragma pack(1)
struct test {
    struct abc {
        short a;
        union b {
            byte b1;
            byte b2;
        }_b;
    }_abc;
    byte c;
};

【讨论】:

  • 最好使用std::(u)int16_t 而不是short,因为short保证为2 个字节(但通常是)。并且std::byte 在 C++17 下不可用,所以在早期的编译器上使用 unsigned charstd::(u)int8_t
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
相关资源
最近更新 更多