使用uint8_t而不是unsigned char(除了审美偏好)的唯一原因是如果您想记录您的程序需要char正好是 8 位。uint8_t存在当且仅当CHAR_BIT==8,根据 C 标准的要求。
其余的intX_t和uintX_t类型在以下情况下很有用:
读/写磁盘/网络(但你还必须使用字节序转换功能)
当您希望在精确截止时进行无符号环绕行为(但这可以通过操作&员更便携地完成)。
当您控制结构的确切布局时,因为您需要确保不存在填充(例如,出于memcmp散列目的)。
另一方面,uint_least8_t, etc. 类型在您想要避免使用浪费的大或慢类型但需要确保您可以存储一定量级的值的任何地方都很有用。例如,虽然long long至少是 64 位,但在某些机器上可能是 128 位,当您需要的只是可以存储 64 位数字的类型时使用它在此类机器上会非常浪费。int_least64_t解决问题。
我会[u]int_fastX_t完全避免使用这些类型,因为它们有时会在给定的机器上发生变化(破坏 ABI),而且定义通常是错误的。例如,在 x86_64 上,64 位整数类型被认为是 16、32 和 64 位值的“快速”类型,但加法、减法和乘法的速度完全相同,无论您使用 32-位或 64 位值,对于大于必要的类型,除法几乎肯定会更慢,即使它们的速度相同,您使用两倍的内存也没有任何好处。
最后,请注意,int32_t当计数器不是本机整数大小时,一些答案关于使用计数器效率低下的论点在技术上大多是正确的,但与更正代码无关。除非您在计算最大计数受您控制的少量事物,或者计数可能是天文数字的某些外部(不在程序内存中)事物,否则计数的正确类型几乎总是size_t. 这就是所有标准 C 函数都size_t用于计数的原因。除非您有充分的理由,否则不要考虑使用其他任何东西。