由于C是一种松散类型的语言,而且stdint.h只定义了typedefs (我假设),那么如何保证ints的宽度呢?
我要问的是实现而不是库的使用。
发布于 2019-11-02 01:49:05
stdint.h是C实现的一部分,它使用任何适合于该实现的底层类型来定义typedef。它不是一个可移植的文件,你可以携带到任何C实现你喜欢。
发布于 2019-11-02 03:56:58
如何保证
<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发布于 2019-11-12 12:43:05
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_t,而不是使用像__int64这样的中间名称并将其键入到int64_t中,但是通过使用这种方法,在stdint.h存在之前编写并定义了自己的名为int64_t的类型的旧代码就不能包含stdint,因此将继续编译。从两个下划线开始的名称历史上一直保留给编译器制造者,因此已经不可能使用名称__int64的现有C代码了。
https://stackoverflow.com/questions/58667615
复制相似问题