Int8_t,int_least8_t 和 int_fast8_t 的区别?

Int 类型 int8_tint_least8_tint_fast8_t之间的区别是什么?

26955 次浏览

规范第 7.8.1.1精确宽度整数类型章第1段:

Typedef 名称 intN_t指定一个带符号整数类型,宽度为 N,没有填充位,以及一个二进制补数表示形式。因此,int8_t表示宽度正好为8位的有符号整数类型。

摘自: 7.18.1.2最小宽度整数类型,第1段:

Typedef 名称 int_leastN_t指定宽度至少为 N 的有符号整数类型,这样大小较小的有符号整数类型都不具有至少指定的宽度。因此,int_least32_t表示宽度至少为32位的有符号整数类型。

最后是 7.18.1.3最快的最小宽度整数类型第2段:

Typedef 名称 int_fastN_t指定宽度至少为 N的最快有符号整数类型。Typedef 名称 uint_fastN_t指定宽度至少为 N 的最快无符号整数类型。

它们与整数的大小有关,而且就是它们听起来的样子。

int8_t is exactly 8 bits
int_least8_t is the smallest int type that has at least 8 bits
int_fast8_t is the fastest int type that has at least 8 bits.

intN_t(和 uintN_t)是 并非所有 C99实现都需要。这些类型是“精确宽度整数类型”。它们在实现中是必需的,因为在实现中使用它们是有意义的(基本上是每台台式计算机)。

在所有 C99实现中,N 为8、16、32和64的值都需要 int_leastN_t。这是“最小宽度整数类型”。

在所有 C99实现中,N 为8、16、32和64的值都需要 int_fastN_t。这是“最快的最小宽度整数类型”。

区别在 Carl Norum 引用的 C99标准的章节中定义。但举个例子可能会有用。

假设您有一个用于36位系统的 C 编译器,char = 9位,short = 18位,int = 36位,long = 72位。然后

  • int8_t 根本不存在,因为没有办法满足 没错8值位没有填充的约束。
  • int_least8_tchar的 typedef。不是 shortint,因为标准要求 最小的类型至少有8位。
  • int_fast8_t可以是任何东西。如果“原生”大小被认为是“快速”的,那么它可能是 int的 typedef。

这里有一个概念上简单的答案: 三种类型的 int * N._ t 的宽度必须 > = N. intN _ t 有 没错 N.位,int _ leastN _ t 是 至少(最窄)这样的类型,int _ fastN _ t 是 最快的这样的类型。

例如,在具有8位字节和32位快速寄存器的机器上,int8 _ t 和 int _ least8 _ t 别名为有符号 char,但 int _ fast8 _ t 别名为 int32 _ t。然而,如果实现选择定义它们,那么 int _ least24 _ t 和 int _ fast24 _ t 都将别名为 int32 _ t,而 int24 _ t 没有定义。

编辑: 正如 Technophile 在下面指出的,快速类型的真正问题是内存,而不是寄存器(通常,对寄存器的低阶位的操作可以像对整个寄存器一样快)。例如,在内存中写入 int8 _ t 可能需要加载包含它的32位字,只修改字节,然后再写回来,而如果它存储在一个32位字中,则可以不读取它。