首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 ><stdint.h>类型如何保证位宽?

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

Stack Overflow用户
提问于 2019-11-02 01:45:47
回答 3查看 109关注 0票数 1

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-02 01:49:05

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

票数 2
EN

Stack Overflow用户

发布于 2019-11-02 03:56:58

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

C不能,C不需要它。

C确实需要最小宽度。

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

代码语言:javascript
复制
(u)int8_t, (u)int16_t, (u)int32_t, (u)int64_t

实现还可以有其他大小,如uint24_t

以下是必需的。

代码语言:javascript
复制
(u)int_least8_t, (u)int_least16_t, (u)int_least32_t, (u)int_least64_t
票数 3
EN

Stack Overflow用户

发布于 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代码了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58667615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档