如何找到 uint_fast32_t 的宽度

How do I find the width of a uint_fast32_t

我希望能够便携地 fprintf() a uint_fast32_tstdint.h 中定义的所有前导零。例如,如果我的平台将 uint_fast32_t 定义为 64 位无符号整数,我想 fprintf() 使用格式说明符 %016lX,但如果它是 32 位无符号整数,我想要使用 %08lX.

有没有像 INTFAST32_BITS 这样的宏我可以使用?

现在我正在使用

#if UINT_FAST32_MAX == 0xFFFFFFFF
#    define FORMAT "08"PRIXFAST32
#elif UINT_FAST32_MAX == 0xFFFFFFFFFFFFFFFF
#    define FORMAT "016"PRIXFAST32
#endif

但这只适用于正好是 32 或 64 位宽的 uint_fast32_t,而且代码也有点笨拙且难以阅读

您可以像查找任何其他类型的大小一样查找 uint_fast32_t 的大小:通过对其应用 sizeof 运算符。结果的单位是类型char的大小。示例:

size_t chars_in_a_uint_fast32_t = sizeof(uint_fast32_t);

但这不足以打印具有 printf 系列函数之一的函数。未定义的行为出现在 printf 等。 al. 如果任何格式化指令与相应参数的类型不匹配,并且 uint_fast32_t 的大小信息不足以进行正确匹配。

这就是 your other answer 中描述的格式化宏的用武之地。它们为每种类型和转换提供了适当的大小修饰符和转换字母。对于 uint_fast32_tX 转换,适当的宏是 PRIXFAST32.

您照常提供任何标志、字段宽度和精度。如果您确实想使用适合 uint_fast32_t 实际大小的字段宽度,那么一个合理的方法是利用选项来指定字段宽度作为参数传递( int 类型)。因此:

uint_fast32_t fast;
// ...
printf("%0*" PRIXFAST32 "\n", (int) sizeof(fast) * 2, fast);

但是,我注意到这似乎有点可疑,因为您正在为比通常更宽的值做准备,您应该允许该类型的任何值变为。 printf 函数在任何情况下都不会打印比表达该值所需的数字更少的数字,假设它确实是指定的类型,所以我倾向于简单地使用一个固定的字段宽度足以用于 32 位整数(比如 8)。