我有一个关于 STM32 微 Controller 的 C 语言类型转换的问题。 现在我正在尝试编写自己的库来控制微 Controller 的外围设备。 但我不明白为什么以及何时应该使用类型转换,如 (uint32_t)。
例如,对于 GPIO 配置寄存器,我看到了下一个示例:
#define INPUT_ANALOG ((uint32_t) 0x00)
#define INPUT_FLOATING ((uint32_t) 0x01)
#define INPUT_PUP_PDOWN ((uint32_t) 0x02)
此信息来自数据表(下面附有打印屏幕)。 在这里我不明白为什么使用类型转换 (uint32_t) 而不仅仅是 0x00 或 0。
我可以使用下一个代码来达到同样的目的吗?
typedef enum{
INPUT_ANALOG = 0,
IN_FLOATING,
IN_PULL_UP_DOWN,
}PinConfInput_t;
我应该对这段代码进行类型转换吗? 你能给我一些关于typecast的学习资料吗? 谢谢
最佳答案
类型转换为 unsigned int
或后缀u
/U
需要值 0x00
, 0x01
, 和 0x02
在许多情况下。 0x00
, 0x01
和 0x02
它们本身就是 类型的常量 int
,还有一些在 int
上运行得可疑的小玩意儿。 s,例如将它们位移到符号位置时!
如果您取值 0x02 (int) 并将其左移到 31:30 位,就会发生这种情况!所以,
0x02 << 30
在整数为 32 位宽的机器上具有未定义的行为,而
0x02U << 30
或
((uint32_t)0x02) << 30
不会。
枚举列表的标识符声明为(C11 6.7.2.2p3)
constants that have type int and may appear wherever such are permitted.
即是的,他们也需要这些转换的类型转换。
请注意,C 中枚举常量的类型不必是枚举本身的类型:
#include <stdio.h>
enum foo {
bar = 42
};
int main(void) {
printf("An enumeration constant is an %s\n",
_Generic(bar,
int: "int",
unsigned int: "unsigned int",
default: "something else"));
printf("On this implementation the enum foo is %s\n",
_Generic((enum foo) 0,
int: "int",
unsigned int: "unsigned int",
default: "something else"));
}
在 GCC 上,这将打印 int
对于枚举常量类型,unsigned int
对于 enum foo
的类型. IE。常量的类型与实际枚举的类型不同。
此外,使用超出整数范围的枚举常量是违反约束的;作为 0x80000000
不能表示为 int
在 32 位系统上,它不能用作可移植的枚举常量:
% gcc enumtest.c -std=c11 -pedantic
enumtest.c:5:11: warning: ISO C restricts enumerator values to range of ‘int’
[-Wpedantic]
5 | bar = 0x80000000
| ^~~~~~~~~~
最后,正如 C 标准所说,枚举的类型 本身 由编译器决定,一些编译器可能会使用 unsigned char
对于短枚举。好吧,即使在那里你也可能需要 Actor ,因为unsigned char
将被提升为 signed int
,而不是 unsigned int
在算术之前。
关于c - STM32微 Controller 类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62729686/