C++ C++;结构装箱单

C++ C++;结构装箱单,c++,packing,C++,Packing,我有一个类似以下的工会: typedef union _thing { struct thing_indiv { uint16_t one:5; uint16_t two:4; uint16_t three:5; uint16_t four:5; uint16_t five:6; uint16_t six:6; uint16_t seven:6; uint16_

我有一个类似以下的工会:

typedef
union _thing
{
    struct thing_indiv {
        uint16_t one:5;
        uint16_t two:4;
        uint16_t three:5;
        uint16_t four:5;
        uint16_t five:6;
        uint16_t six:6;
        uint16_t seven:6;
        uint16_t eight:7;
        uint16_t nine:4;
        uint16_t ten:5;
        uint16_t eleven:6;
        uint16_t twelve:5;
        uint16_t thirteen:5;
        uint16_t fourteen:4;
        uint16_t fifteen:2;
        uint16_t unused:5;
    } __attribute__((packed)) thing_split;
    uint8_t thing_comb[10];
    
} thing;
但这并不是我所期望的。我想将字节分配给
thing.thing\u comb
并从
thing.thing\u split
中检索相关项

例如,如果
thing\u comb={0xD6,0x27,0xAD,0xB6…}
我希望thing.thing\u split.one包含
0x1A
0xD6
的5个最高有效位,但它没有,它包含
0x16
,5个最低有效位。我将每个字段声明为
uint16\u t
,以防止gcc抱怨跨过字节边界(我在
uint8\u t
中体验到相同的行为)


< P>是否有一种方法来构造这个结构来获得这个行为?

,首先,用C++中的联合来键入双关语是未定义的行为。 第二,编译器可以自由地对位字段执行任何操作,而不是强迫它按照您的要求进行布局

您需要使用带位移位的常规位打包来获得所需的行为

不久前我有一个类似的问题:
首先,在C++中使用联合的双关语是不确定的行为。 第二,编译器可以自由地对位字段执行任何操作,而不是强迫它按照您的要求进行布局

您需要使用带位移位的常规位打包来获得所需的行为

不久前我有一个类似的问题:

<代码>联合< /COD>不能用于C++中的类型双关。“跨越字节边界”。你仍然有那些
5+4+5=14
14+5>16
。哦,好吧。有没有其他机制可以用来获得这种行为,或者我是被迫使用按位运算符来完成我需要的操作?位域是特定于实现的,直到编译器使用低、高(或中)值为止一个潜在类型的位元。这可能与大VS小的连接有关,不能用于C++中的类型双关。“跨越字节边界”。你仍然有那些
5+4+5=14
14+5>16
。哦,好吧。有没有其他机制可以用来获得这种行为,或者我是被迫使用按位运算符来完成我需要的操作?位域是特定于实现的,直到编译器使用低、高(或中)值为止底层类型的位。可能这与大端和小端有关,位字段是实现定义的,这意味着编译器必须记录它,然后根据记录的行为进行操作。你写的东西听起来像是未编撰的,这是你说得对的。但重要的是它确实是依赖的编译器上的nt和不同的编译器将产生不同的结果。在一台计算机上工作的东西不会在另一台编译器上工作。为什么在没有答案的情况下引用一个问题?“在一台计算机上工作的东西不会在另一台计算机上工作。”不,这意味着在一台编译器上工作的东西不会在另一台计算机上工作compiler@idclev463035818: “为什么要在没有答案的情况下引用问题?”。现在有一个问题:-)位字段是实现定义的,这意味着编译器必须对其进行记录,然后根据记录的行为进行操作。您编写的内容听起来像是未编入类别的,这是有区别的,您是对的。但重要的是,它确实依赖于编译器,不同的编译器将产生不同的结果。在一台机器上工作的东西不会在另一台编译器上工作。为什么在没有答案的情况下引用问题?“在一台机器上工作的东西不会在另一台机器上工作。”不,这意味着在一台编译器上工作的东西不会在另一台机器上工作compiler@idclev463035818:“为什么在没有答案的情况下引用一个问题?”。现在有一个问题:-)