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++ - 为什么固定宽度类型委托(delegate)回基元?

c++ - 标准是否保证 uint8_t、int8_t 和 char 都是唯一类型?

完全关闭c中的文件

c - 内存和时间高效的 PI 算法(二进制)

创建一个 gets 函数,该函数在使用 getchar 函数按下返回时返回 char*

无法正确地将 uint64_t 转换为 double 。我缺少什么?

C套接字程序错误

c - 为什么数组的最大大小是 "too large"?

C++ F32 包含文件?

c++ - 为什么我们在 C++ 中没有 <cstdfloat>?