<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 等(或者更确切地说,它具有该大小的内存块 + 在该大小的内存上运行的操作,并将其视为有符号或无符号)
所以创建你的编译器的人是那些定义你的编译器在你请求 int
和 stdint.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
。
由于 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 等(或者更确切地说,它具有该大小的内存块 + 在该大小的内存上运行的操作,并将其视为有符号或无符号)
所以创建你的编译器的人是那些定义你的编译器在你请求 int
和 stdint.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
。