【发布时间】:2021-08-27 03:24:06
【问题描述】:
这是来自 ST CMSIS 标头的示例:
#define USART_ISR_TC_Pos (6U)
#define USART_ISR_TC_Msk (0x1UL << USART_ISR_TC_Pos)
在 CMSIS 标头中,位域位置 (_Pos) 以 unsigned int 类型的十进制整数常量的形式给出,未移位的掩码为 unsigned long int。
为什么它们都没有指定为unsigned long int?
【问题讨论】:
-
可能是因为如果您使用的是 64 位系统,则位置在 0..63 之内,适合
unsigned int范围,而<<的结果可能会超出unsigned int的范围,因此它应该是UL(可以是32位或64位,取决于系统)。 -
<<的右边只是要移位的位数,人类更喜欢十进制(“第 4 位”)。但是你可以在任何基础(八进制,十六进制)中做到这一点。当然这应该是一个正数。 -
unsigned int需要能够至少保持 2^16。这可能有点短视,但我无法想象一台机器不足以描述unsigned long中的位数。并且在移位操作中使用任何大于位数的值都会导致未定义的行为。因此,即使是unsigned char也足够了。
标签: c embedded stm32 cortex-m cmsis