c++中结构体位域使用注意事项

版权声明:heibao111728 https://blog.csdn.net/heibao111728/article/details/83538882

1、一个位域必须存储在同一个单元中,不能跨两个单元。如一个单元所剩空间不够存放另一位域时,应从下一单元起存放该位域。如下

第一个unsigned short 中 没有足够的空间存储system_clock_reference_base_29_15_,所以应当先将第一个unsigned short用'0'补齐,从下一个能够容得下该数据的空间开始存放。

2、可以使用无名域位,这样的域位作用只是用来补齐,不能使用。

3、一个空间的开始位置一定是从该空间大小的整数倍开始。

/**
*   PS packet header
*/
typedef struct ps_packet_header
{
    unsigned char start_code[4];                            // '0x00 00 01 ba', 32 bit, 4 byte

    unsigned short fix_code : 2;                              // must be '0x 01'
    unsigned short system_clock_reference_base_32_30_ : 3;
    unsigned short marker_bit_1 : 1;
    unsigned short : 0;                  //剩余2bit用0补齐

    unsigned short system_clock_reference_base_29_15_ : 15;
    unsigned short marker_bit_2 : 1;                           // 52 bit

    unsigned short system_clock_reference_base_14_0_ : 15;
    unsigned short marker_bit_3 : 1;                           // 70 bit

    unsigned short system_clock_reference_extension : 9;
    unsigned short marker_bit_4 : 1;                           // 80 bit,  10 Byte
    unsigned short : 0;                 //剩余6bit用0补齐

    unsigned int program_mux_rate : 22;
    unsigned int marker_bit_5 : 1;
    unsigned int marker_bit_6 : 1;                           // 104 bit, 13 Byte

    unsigned char reserved : 5;
    unsigned char pack_stuffing_length : 3;                 // 112 bit, 14 Byte
}ps_packet_header_t;

猜你喜欢

转载自blog.csdn.net/heibao111728/article/details/83538882