繁体   English   中英

int8_t,int_least8_t和int_fast8_t的区别?

[英]The difference of int8_t, int_least8_t and int_fast8_t?

int类型int8_tint_least8_tint_fast8_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。

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

type_f name 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指定宽度至少为N的最快有符号整数类型。 typedef名称uint_fast N _t指定宽度至少为N的最快无符号整数类型。

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

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

对于N为int_fastN_t和64的值,所有C99实现都需要int_fastN_t 。这是“最快的最小宽度整数类型”。

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

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

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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM