C / C ++ - uint8_t x:6

时间:2016-10-13 09:40:17

标签: c

道歉,如果这是一个基本问题,但我在:的定义中第一次看到这些冒号(struct)。这些冒号做了什么?

struct gsm48_meas_res {
    uint8_t rxlev_full:6,
         dtx_used:1,
         ba_used:1;
    uint8_t rxlev_sub:6,
         meas_valid:1,
         spare:1;
    uint8_t no_nc_n_hi:1,
         rxqual_sub:3,
         rxqual_full:3,
         spare2:1;
    uint8_t rxlev_nc1:6,
         no_nc_n_lo:2;
    uint8_t bsic_nc1_hi:3,
         bcch_f_nc1:5;
    uint8_t rxlev_nc2_hi:5,
         bsic_nc1_lo:3;
    uint8_t bsic_nc2_hi:2,
         bcch_f_nc2:5,
         rxlev_nc2_lo:1;
    uint8_t rxlev_nc3_hi:4,
         bsic_nc2_lo:4;
    uint8_t bsic_nc3_hi:1,
         bcch_f_nc3:5,
         rxlev_nc3_lo:2;
    uint8_t rxlev_nc4_hi:3,
         bsic_nc3_lo:5;
    uint8_t bcch_f_nc4:5,
         rxlev_nc4_lo:3;
    uint8_t rxlev_nc5_hi:2,
         bsic_nc4:6;
    uint8_t bcch_f_nc5_hi:4,
         rxlev_nc5_lo:4;
    uint8_t rxlev_nc6_hi:1,
         bsic_nc5:6,
         bcch_f_nc5_lo:1;
    uint8_t bcch_f_nc6_hi:3,
         rxlev_nc6_lo:5;
    uint8_t bsic_nc6:6,
         bcch_f_nc6_lo:2;
} __attribute__ ((packed));

我在为这些uint8_t变量赋值时遇到了一些问题。最初我认为这是默认的任务,但在耗尽所有其他可能性后,我认为它与这些冒号有关。

1 个答案:

答案 0 :(得分:2)

这是一个比特领域,这是任何标准都很难控制的。例如

uint8_t rxlev_full:6,
         dtx_used:1,
         ba_used:1;

表示“在内存中的某处,给我6位然后1位然后1位”。您无法以可移植的方式知道或假设位顺序 - 它是特定于编译器的。此外,仅为_Boolsigned intunsigned int定义标准位字段。使用uint8_t是非标准扩展。

所以不知道这段代码究竟会做什么。您必须阅读编译器手册以了解具体信息。