如何创建一个具有 32 位 int 和四个 8 位 char 类型的联合,每个 char 类型都引用 32 位 int 的不同切片?

How to create a union with a 32 bit int and four 8 bit char types that each refer to difference slice of the 32 bit int?

我想创建一个最大成员为 32 位整数的联合。主要写到这里。然后有四个 8 位变量,可能是 char 类型,每个变量将引用 32 位整数的不同部分,例如:

   union {
   int32 myint;
   char char1 [7:0];
   char char2 [15:8];
   char char3 [23:16];
   char char4 [31:24];
   }

但我不确定如何在 C++ 中执行此操作。

这可能有效:

union {
   int32 myint;
   char chars[4];
};

你可以使用这个:

union myUnion {
    int32   myint;
    struct {
        char char1;
        char char2;
        char char3;
        char char4;
    } myChars;
};

uint8_t:

union myUnion {
    uint32_t  myint;
    struct {
        uint8_t b1;
        uint8_t b2;
        uint8_t b3;
        uint8_t b4; // or number them in reverse order
    } myBytes;
};

here

union intBytes {
    int32   myInt;
    struct {
        char char1;
        char char2;
        char char3;
        char char4;
    };
    char charArray[4];
};

intBytes dummy;

您在上面看到结构包装 char1-char4 没有分配名称。这称为 anonymous struct。匿名结构的成员可以在范围内直接访问 环绕 结构。

如果没有结构 char1 - char4 将在联合内重叠,并且都将引用 myInt 的第一个字节。匿名结构确保 char1 - char 按顺序排列。

C 有匿名结构和联合。 C++(C++11 之前)不允许匿名结构,只定义了匿名联合。但是,大多数 C++ 编译器(llvm、gcc)允许匿名 struct/unions.

在 C++11 中向 C++ 添加了匿名结构。

这允许您访问 dummy.char4,而通常您必须键入 dummy.nameOfCharStruct.char4。由于这不是符合标准的 c++(我相信它在 post C++03 Standatd 中被更改),您最好添加结构名称或使用数组方法。

我不明白你是想要一个 32 位整数和 4 个 8 位变量还是一个 32 位整数分成 4 个 8 位变量,但无论如何你应该尝试这样的事情:

union yourUnion {
    int32 yourInt;
    struct {
        int32 var1 : 8;
        int32 var2 : 8;
        int32 var3 : 8;
        int32 var4 : 8;
    } yourSplitInterger;
};

希望对您有所帮助。