【问题标题】:BitField Variable Syntax位域变量语法
【发布时间】:2014-05-12 10:34:46
【问题描述】:

我对 C++ 中 BitFields 的语法约定以及是否需要在分配的位数中考虑不同的命名变量方法感兴趣。

union BitField32
{
    struct {
        unsigned int a : 1;
        unsigned int b : 1;
    };
    unsigned int data;
};
BitField32 Flags;

union BitField32
{
    struct {
        unsigned int a, b : 1;
    };
    unsigned int data;
};
BitField32 Flags;

在底部示例中命名变量是否需要使用两位或分配一个位

【问题讨论】:

  • 为什么不尝试将第二个 union 中的 a 设置为大于 1 的值,看看会发生什么?
  • 根据 cppreference.com 有 C++98 和 C++11 对位域的引用。我目前正在使用 C++11。
  • “在底部示例中命名变量是否需要使用两个位,或者它们是否分配了一个位”-> 需要改写一下吗?也许你不了解位域。毕竟这是一个int,位域的每个方面都依赖于实现。

标签: c++ c++11 bit-fields


【解决方案1】:

没有等价的:

与:

struct S1 {
    unsigned int a : 1;
    unsigned int b : 1;
};

struct S2 {
    unsigned int a : 1, b : 1;
};

struct S3 {
    unsigned int a;
    unsigned int b : 1;
};

struct S4 {
    unsigned int a, b : 1;
};

我们有 S1S2 是等价的,S3S4 是等价的。
S1S3 不是。 (https://ideone.com/6Jvh36)

【讨论】:

    【解决方案2】:

    一次获取一段代码。

    union BitField32
    {
        struct {
            unsigned int a : 1;
            unsigned int b : 1;
        };
        unsigned int data;
    };
    BitField32 Flags;
    

    这是一个包含两个位标志的结构的并集,带有一个无符号整数。 C++ 标准保证这两个位标志将被打包到某种分配单元中,但不保证该单元的大小、位域的分配或其对齐方式。尤其是高位到低位和低位到高位的分配都是司空见惯的。

    因此,尝试使用位域来挑选 unsigned int 中的位是实现定义的。如果它适用于一个编译器,它可能不适用于另一个。必要时使用它,但要非常小心。

    union BitField32
    {
        struct {
            unsigned int a, b : 1;
        };
        unsigned int data;
    };
    BitField32 Flags;
    

    此代码几乎可以肯定是错误的。它是一个包含一个 unsigned int 和一个单比特标志的结构与一个 unsigned int 的联合。它们不仅没有分配一个位,甚至没有被打包到一个 unsigned int 中。

    C++ 标准规定位域属性不是类型的一部分。如果您认为它与第一个样本相似,那么事实并非如此。不要这样写代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-04
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      相关资源
      最近更新 更多