int8_t,int_least8_t和int_fast8_t的区别?
inttypesint8_t
, int_least8_t
和int_fast8_t
之间有什么区别?
卡尔·诺鲁姆所引用的C99标准的不同之处在于其区别。 但是有一个例子可能是有用的。
假设您有一个36位系统的C编译器,其中char
= 9位, short
= 18位, int
= 36位, long
= 72位。 然后
-
int8_t
不存在 ,因为没有办法满足没有填充正好具有8位值的约束。 -
int_least8_t
是char
的typedef。 不是short
或int
,因为标准要求至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.