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

时间:2019-11-02 01:45:47

标签: c linker compiler-construction

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

  

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

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

答案 2 :(得分:1)

C编译器最终需要编译为机器代码。机器码仅具有硬的固定宽度类型,例如32位int,64位int等。(或更确切地说,它具有该大小的内存块+在该大小的内存上进行操作的操作,或者将其视为带符号的或带符号的未签名)

因此,创建编译器的人是定义编译器在您要求int时实际使用的内容的人,而stdint.h头文件是他们编写的文件。基本上是他们所做工作的文档。他们知道例如它们的long类型为64位,因此请添加typedef long int64_t;等。

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

C标准仅定义了编译器必须提供一个stdint.h头,并且如果在其中定义int64_t,它必须映射为正确的数据类型。大小。

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

相关问题