<stdint.h> 类型如何保证位宽?

How can <stdint.h> types guarantee bit width?

由于 C 是一种松散类型的语言并且 stdint.h 只定义了 typedefs(我假设),如何保证整数的宽度?

我问的是实现而不是库的使用。

stdint.h 是 C 实现的一部分,它使用适合该实现 的任何基础类型定义 typedef。它不是您可以携带到您喜欢的任何 C 实现的可移植文件。

How can <stdint.h> types guarantee bit width?

C 不能,C 也不需要。

C 确实需要 最小 宽度。


仅在支持它们的系统上才需要以下个性化,没有填充和符号类型的 2 的补码。

(u)int8_t, (u)int16_t, (u)int32_t, (u)int64_t

一个实现可以选择其他大小,例如 uint24_t

以下为必填项。

(u)int_least8_t, (u)int_least16_t, (u)int_least32_t, (u)int_least64_t

C编译器最终需要编译成机器码。机器代码只有硬 fixed-width 类型,如 32 位 int、64 位 int 等(或者更确切地说,它具有该大小的内存块 + 在该大小的内存上运行的操作,并将其视为有符号或无符号)

所以创建你的编译器的人是那些定义你的编译器在你请求 intstdint.h header 文件时实际使用的人是他们写的文件。它基本上是记录他们所做的事情。他们知道,例如他们的 long 类型大小为 64 位,因此添加 typedef long int64_t;

int 是 16 位而 long 是 32 位的系统上,他们甚至可以让编译器理解特殊的内部类型,例如将其命名为 __int64 然后使 stdint.h 包含一个 typedef __int64 int64_t;.

C 标准只是定义编译器必须提供 stdint.h header,如果您在其中定义 int64_t,它必须映射到大小合适的数据类型。

理论上 可以将 stdint.h 中的所有内容构建到编译器中(因此不用使用像 __int64 这样的中间名称并将其类型定义为 int64_t,他们可以直接使用 int64_t,但是通过使用这种方法,在 stdint.h 之前编写的旧代码存在并定义了他们自己的名为 int64_t 的类型可以不包含 stdint并将因此继续编译。以两个下划线开头的名称在历史上一直为编译器制造商保留,因此现有的 C 代码不可能已经使用名称 __int64