int8_t,int_least8_t和int_fast8_t的区别?

inttypesint8_tint_least8_tint_fast8_t之间有什么区别?

卡尔·诺鲁姆所引用的C99标准的不同之处在于其区别。 但是有一个例子可能是有用的。

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

  • int8_t 不存在 ,因为没有办法满足没有填充正好具有8位值的约束。
  • int_least8_tchar的typedef。 不是shortint ,因为标准要求至less有8位的最小types。
  • int_fast8_t可以是任何东西。 如果“本地”大小被认为是“快速”,那么很可能是int的typedef。

从规范部分7.8.1.1准确宽度整数types ,段落1:

typedef名称int N _t指定宽度为N的无符号整数types,不填充位和二的补码表示。 因此, int8_t表示宽度恰好为8位的有符号整数types。

来自: 7.18.1.2最小宽度整数types ,第1段:

typedef名称int_least N _t指定一个宽度至less为N的有符号整数types,使得没有小于大小的有符号整数types至less具有指定的宽度。 因此, int_least32_t表示宽度至less为32位的有符号整数types。

最后从7.18.1.3最快的最小宽度整数types ,第2段:

typedef名称int_fast N _t指定宽度至less为N的最快有符号整数types。 typedef名称uint_fast N _t指定宽度至less为N的最快无符号整数types。

intN_t (和uintN_t在所有C99实现中都不必需的 。 这些types是“精确宽度的整数types”。 他们是必要的实现,它是有意义的(基本上每个台式计算机)。

在所有的C99实现中, int_leastN_t都是int_leastN_t和64的N的值。这是“最小宽度整数types”。

int_fastN_t在所有的C99实现中都是int_fastN_t和64的N值所必需的。这是“最短的最小整数types”。

这里是一个概念上简单的答案:所有三种types的int * N_t的宽度必须大于等于N.intN_t 正好有 N位,int_leastN_t是最小 (最窄)的types,而int_fastN_t是最快的types。

例如,在具有8位字节和32位快速寄存器的机器上,int8_t和int_least8_t被别名为signed char,而int_fast8_t被别名为int32_t。 而如果实现select定义它们,则int_least24_t和int_fast24_t将被别名为int32_t,而int24_t则是未定义的。

编辑:正如Technophile指出的那样,快速types的真正问题是内存,而不是寄存器(通常,寄存器的低位操作可以像在整个寄存器上一样快)。 例如,在内存中写入一个int8_t可能需要加载包含它的32位字,只修改该字节,然后再写回,而如果存储在32字中,则可能无法读取。

这些与整数的大小有关,而且正是它们听起来像。

 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.