【问题标题】:How do I find the width of a uint_fast32_t如何找到 uint_fast32_t 的宽度
【发布时间】:2020-09-17 07:26:30
【问题描述】:

我希望能够将fprintf()uint_fast32_t 定义为stdint.h 中的所有前导零。例如,如果我的平台将 uint_fast32_t 定义为 64 位无符号整数,我想使用 %016lX 之类的格式说明符来定义 fprintf(),但如果它是 32 位无符号整数,我想使用 @987654328 @。

我可以在某处使用像 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 将拥有"have at least the specified width" C11 Standard - 7.20.1.3 Fastest minimum-width integer types。因此,您可以保证 32 位。为什么不满足你的约束。它将是 32 位或 64 位,但不会更小。
  • @DavidC.Rankin 他们可能想推广到假设的uint48_tuint128_t

标签: c printf stdint


【解决方案1】:

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

size_t chars_in_a_uint_fast32_t = sizeof(uint_fast32_t);

但这对于使用printf-family 函数之一打印一个是不够的。 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)。

【讨论】:

  • 关于“……提供比您应该允许的任何该类型值更广泛的值”:不一定。例如,为多精度算术编写代码是合理的,至少需要 32 位单元,但可以适应实现提供的任何更大的值。
猜你喜欢
  • 2011-05-29
  • 2022-11-24
  • 2012-12-25
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 2014-01-03
  • 2010-09-20
  • 2019-10-12
相关资源
最近更新 更多