int8_t,int_least8_t和int_fast8_t的区别?

时间:2011-03-10 00:23:29

标签: c

int类型int8_tint_least8_tint_fast8_t之间有什么区别?

5 个答案:

答案 0 :(得分:62)

差异在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。

答案 1 :(得分:57)

从规格部分 7.8.1.1精确宽度整数类型,第1段:

  

typedef名称 int N _t 指定有符号整数类型,宽度为N,无填充位,以及二进制补码表示。因此, int8_t 表示有符号整数类型,宽度恰好为8位。

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

  

typedef名称 int_least N _t 指定宽度至少为N的有符号整数类型,这样没有较小尺寸的有符号整数类型至少具有指定的宽度。因此, int_least32_t 表示有符号整数类型,宽度至少为32位。

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

  

typedef名称 int_fast N _t 指定最快的有符号整数类型,其宽度至少为名词的。 typedef名称 uint_fast N _t 指定宽度至少为N的最快无符号整数类型。< / p>

答案 2 :(得分:15)

intN_t(和uintN_t在所有C99实施中都不是必需的。这些类型是“精确宽度整数类型”。在实现它们(实际上是每台台式计算机)的实现中都需要它们。

对于N值为8,16,32和64的值,所有C99实现都需要

int_leastN_t。这是“最小宽度整数类型”。

对于N为8,16,32和64的值,所有C99实现中都需要

int_fastN_t。这是“最快的最小宽度整数类型”。

答案 3 :(得分:10)

这是一个概念上简单的答案:所有三种类型的int * N_t的宽度必须是&gt; = N.intN_t具有完全 N位,int_leastN_t是最少 (最窄)这种类型,而int_fastN_t是最快这种类型。

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

编辑:正如Technophile所指出的那样,快速类型的真正问题是存储器,而不是寄存器(通常,对寄存器的低位操作的操作可以与整个寄存器一样快)。例如,写入内存中的int8_t可能需要加载包含它的32位字,仅修改字节,然后将其写回,而如果它存储在32字中则可以在不读取的情况下写入。

答案 4 :(得分:-1)

这些与整数的大小有关,正如它们听起来的那样。

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.