gpt4 book ai didi

c - STM32微 Controller 类型转换

转载 作者:行者123 更新时间:2023-12-04 00:17:36 26 4
gpt4 key购买 nike

我有一个关于 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的学习资料吗?谢谢

enter image description here

最佳答案

类型转换为 unsigned int 后缀u/U需要值 0x00 , 0x01 , 和 0x02在许多情况下。 0x00 , 0x010x02它们本身就是 类型的常量 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com