c - 在编译期间如何转换 <stdint.h> 中的标准整数?

标签 c stdint cstdint

在 C 语言中,使用相同的源代码来针对不同的处理器架构是很常见的(或者至少是可能的)。处理器架构以不同方式定义整数大小也很常见。为了提高代码可移植性并避免整数大小限制,建议使用 C 标准整数头。但是,我对它的实际实现方式感到困惑。

如果我编写了一个为 x86 编写的小 C 程序,然后决定将其移植到 8 位微 Controller ,微 Controller 编译器如何知道如何将“uint32_t”转换为其 native 整数类型?

编写 C 编译器时是否有一些映射要求?例如,如果您的编译器要兼容 C99,您需要有一个映射功能来将所有 uint32_t 替换为 native 类型?

谢谢!

最佳答案

通常<stdint.h>包含相当于

typedef int int32_t;
typedef unsigned uint32_t;

选择适合当前机器的实际类型。

实际上,它通常比这复杂得多,有大量额外的辅助头文件和辅助预处理器宏,但效果是相同的:名称如 uint32_t最终成为真正的类型名称,就像 typedef 定义的那样.

您问“如果您的编译器要兼容 C99,您需要具有映射功能吗?”,答案基本上是"is",但“映射功能”可以只是编译器编写者选择的特定类型在其分布式副本 stdint.h 中。 (为了回答你的另一个问题,是的,有多少个编译器就有多少个 <stdint.h> 的副本;没有一个主副本或任何东西。)

单方面评论。您说,“为了增加代码可移植性并避免整数大小限制,建议使用C标准整数头”。真正的建议是,当您有特殊要求时(例如具有精确类型的尺寸),请使用该 header 。如果出于某种原因您需要一个有符号类型,例如 32 位,那么无论如何,请使用 int32_t来自stdint.h 。但大多数时候,你会发现像int这样的“普通”类型。和long都很好。请不要让任何人告诉您必须为声明的每个变量选择精确的大小,并使用 stdint.h 的类型名称。来声明它。

关于c - 在编译期间如何转换 <stdint.h> 中的标准整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40439345/

相关文章:

c++ - 我可以排队删除文件吗?

c - 如何从 OpenCL 设备写入/读取单个浮点值(缓冲区)

c++ - 在命令行上构建时找不到 cstdint 文件

visual-c++-6 - VC6 : fatal error C1083: Cannot open include file: 'stdint.h'

c - 对象宏的最大大小

c++ - C++ 中的 long long int 与 long int 与 int64_t

c++ - cstdint typedef 是否可以绑定(bind)到某些实现特定类型 std::numeric_limits 不是专门用于?

c - 为什么我在引用来自不同函数的一行时会出现此编译器错误?

python - 如何在C中使用openssl解密密文?

c - 将 stdint.h 包含在头文件中会破坏使用 Clock_gettime() 进行的编译