1. 程式人生 > >c++中結構體位域使用注意事項

c++中結構體位域使用注意事項

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;