C 编程 - struct 中的 2U 或 8U 是什么

问题描述 投票:0回答:1

此链接中的代码:https://github.com/openwch/arduino_core_ch32/blob/main/libraries/USBPD_SINK/src/usbpd_def.h

我正在查看上一个文件。我做了一些搜索,发现了一些关于 unsign int Literal 的内容。但是,我不确定在这种情况下它有何意义,希望有人可以向我解释一下。

typedef struct 
{
    uint32_t MaxOperatingCurrent10mAunits : 10u;
    uint32_t OperatingCurrentIn10mAunits  : 10u;
    uint32_t Reserved20_21                : 2u; // 00b
    uint32_t EPRModeCapable               : 1u; 
    uint32_t UnchunkedExtendedMessage     : 1u;
    uint32_t NoUSBSuspend                 : 1u;
    uint32_t USBCommunicationsCapable     : 1u;
    uint32_t CapabilityMismatch           : 1u;
    uint32_t GiveBackFlag                 : 1u;
    uint32_t ObjectPosition               : 4u;
}USBPD_SinkFixedVariableRDO_t;

假设 32 位填充,该结构的总大小是否为 44 字节?每个结构体成员末尾的 10u、2u 是什么?

c struct literals
1个回答
0
投票

这是一种称为位字段的不可移植类型的结构,其中某些成员的大小以位为单位,由每个成员后面的

: n
指定。所以
MaxOperatingCurrent10mAunits
是 10 位大,依此类推。位顺序不是由 C 语言指定的,因此它可以是任何内容。

一般建议是避免使用位字段,而是使用位掩码和位移位以及按位运算符,因为它们是可移植的和确定性的。与 C 标准严重未指定的位字段不同。

在这种情况下,位大小被指定为以

u
/
U
结尾的无符号整数常量没有任何意义。始终使用未签名而不是签名是一般的良好做法,但在这种特定情况下并不重要。一些编码标准(例如 MISRA C)在需要无符号类型的地方强制执行无符号常量,因此可以使用
u
写入位大小,以静默 MISRA 检查器。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.