C/C++ - uint8_t x :6 中冒号的用途是什么

标签 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 变量赋值时遇到了一些问题。最初我认为这是默认分配,但在穷尽所有其他可能性之后,我认为它与这些冒号有关。

最佳答案

这是一个位域,任何标准都很难对其进行监管。例如

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

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

因此无法说明这段代码实际会做什么。您必须阅读编译器手册才能了解具体细节。

关于C/C++ - uint8_t x :6 中冒号的用途是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40017465/

相关文章:

c++ - 如何判断一个点是否在矩形内?

c - 根据泽肯多夫定理进行斐波那契编码

c - pthread_cond_wait 与信号量

C 程序是一个菜单并使用 switch case。到目前为止,选项 A,输入 GPA 有效,但对于选项 B,平均分是错误的

python - 从实现 __dict__ 的 C 创建 Python 类型?

输入后忽略回车键的C代码

c - 在 C 字符串上放置一个掩码

c - 错误 : variably modified 'd' at file scope

c - 外部关键字和设置字符串变量

c# - 如何在 8*8 DataMatrix 中编码超过 3 个字符?