3

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

有没有INTFAST32_BITS我可以使用的宏?

现在我正在使用

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

但这仅适用于uint_fast32_t恰好 32 或 64 位宽的情况,而且代码也有点笨重且难以阅读

4

1 回答 1

4

您可以像找到uint_fast32_t任何其他类型的大小一样找到 a 的大小:通过将sizeof运算符应用于它。结果的单位是 type 的大小char。例子:

size_t chars_in_a_uint_fast32_t = sizeof(uint_fast32_t);

但这对于打印具有printf-family 功能之一的功能是不够的。未定义的行为出现在printf 等。人。如果任何格式化指令与相应参数的类型不匹配,并且 of 的大小uint_fast32_t不足以进行正确匹配。

这是您在其他答案中已经描述的格式化宏的来源。它们为每种类型和转换提供了适当的大小修饰符和转换字母。对于 的X转换uint_fast32_t,适当的宏是PRIXFAST32

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

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

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

于 2020-05-29T19:48:14.847 回答