int8_t、int_least8_t和int_fast8_t这三种int类型有什么区别呢?
int8_t、int_least8_t和int_fast8_t这三种int类型有什么区别呢?
在 Carl Norum 引用的 C99 标准的章节中定义了这些差异。但是举个例子可能会很有用。
假设您有一个适用于 36 位系统的 C 编译器,其中 char
= 9 位,short
= 18 位,int
= 36 位,long
= 72 位。那么:
int8_t
不存在,因为没有办法满足仅使用 正好 8 个值位而不进行填充的约束条件。int_least8_t
是 char
的 typedef。而不是 short
或 int
,因为标准要求使用至少 8 位的 最小 类型。int_fast8_t
可以是任何东西。如果认为 "本机" 大小很快,则可能是 int
的 typedef。来自规范部分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
表示具有至少N宽度的最快有符号整数类型。typedef名称uint_fast
N_t
表示具有至少宽度N的最快无符号整数类型。
这里有一个概念上简单的答案:对于所有三种类型,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字中,则可以在无需读取的情况下写入。
intN_t
(以及uintN_t
)并非所有C99实现都需要。这些类型是“精确宽度整数类型”。它们在适用的实现中是必需的(基本上是每台桌面计算机)。
对于值为8、16、32和64的N,所有C99实现都需要int_leastN_t
。这是“最小宽度整数类型”。
对于值为8、16、32和64的N,所有C99实现都需要int_fastN_t
。这是“最快的最小宽度整数类型”。
这些与整数的大小相关,正如它们听起来的那样。
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.
int_least8_t
和int_fast8_t
有什么区别? - Conrad Meyer