int8_t,int_least8_t和int_fast8_t的区别?

Neb*_*Fox 56 c

int类型有什么区别int8_t,int_least8_tint_fast8_t

dan*_*n04 65

差异在Carl Norum引用的C99标准部分中定义.但是举一个例子可能是有用的.

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

  • int8_t 不存在,因为没有办法满足恰好有 8个值位而没有填充的约束.
  • int_least8_t是一个typedef char.不是short或者int,因为标准要求最小类型至少8位.
  • int_fast8_t可以是任何东西.int如果"原生"大小被认为是"快" 的话,它可能是一个typedef .


Car*_*rum 57

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

typedef名称N指定有符号整数类型,其宽度为N,无填充位和二进制补码表示.因此,表示具有正好8位宽度的有符号整数类型.int_tint8_t

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

typedef名称N指定宽度至少为N的有符号整数类型,这样没有较小大小的有符号整数类型至少具有指定的宽度.因此,表示宽度至少为32位的有符号整数类型.int_least_tint_least32_t

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

typedef名称N指定宽度至少为N的最快有符号整数类型.typedef名称N指定宽度至少为N的最快无符号整数类型.int_fast_tuint_fast_t


pmg*_*pmg 16

intN_t所有C99实现中都不需要(和uintN_t).这些类型是"精确宽度整数类型".它们在具有它们的意义上是必需的(基本上每台台式计算机).

int_leastN_t 对于N的值为8,16,32和64,在所有C99实现中都是必需的.这是"最小宽度整数类型".

int_fastN_t 对于N,8,16,32和64的值,在所有C99实现中都是必需的.这是"最快的最小宽度整数类型".


Jim*_*ter 12

这是一个概念上简单的答案:所有三种类型的int*N_t的宽度必须> = 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字中,则可以在不读取的情况下写入.

  • 只有在阅读*this*回答后,我才意识到*int_fastN_t*类型的重要性.*N位寄存器*.很明显,然而来自面向对象的世界(Java),起初很难实现这一点(至少在一个人身上). (3认同)
  • @Kohányi Róbert:这并不是因为Java是面向对象的(也是C++)。这是因为Java是机器无关的(抽象的)。这就是为什么“注册”的概念在 Java 中毫无意义(而且也是被禁止的)。 (3认同)
  • @Kohányi Róbert:这可能与内存访问有关。例如,假设内存是 64 位字。考虑如何将 8 位、16 位或 32 位值写入内存位置:处理器可能必须读取内存、修改所需位然后写入 64 位值,而可以写入 64 位值在一次访问中。 (2认同)