c - STM32微 Controller 类型转换

标签 c casting stm32

我有一个关于 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/

相关文章:

c - 如何对指针进行类型转换以适应变量结构?

在 Mac OS X 中从摄像头捕获视频

c++ - 将 auto_ptr<Base> 转换为 auto_ptr<Derived>

random - STM32 RNG 时钟错误

c - log2 在 C 中导致 STM32F4 MCU 出现故障

c - 在子进程终止之前从父进程退出()程序

c++ - 转换运算符转换为仅模板参数不同的类?

c - 以下哪一种是设置无符号整数最大值的更便携的方法?

hash - Python 与 STM32 内置 HASH 设备中的 SHA256 摘要不一致

arrays - 找出数字的所有数字是否相等