如何使用32位int和4个8位char类型创建一个联合,每个类型都引用32位int的差异切片?

时间:2016-01-11 22:57:17

标签: c++ unions

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

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

但我不确定如何在C ++中这样做。

4 个答案:

答案 0 :(得分:6)

这可能有效:

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

答案 1 :(得分:5)

您可以使用:

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

答案 2 :(得分:5)

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

git mv

希望它有所帮助。

答案 3 :(得分:2)

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

intBytes dummy;

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

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

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

在C ++ 11中将匿名结构添加到C ++中。

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