【问题标题】:Why is the format specifier for uint8_t and uint16_t the same (%u)? [duplicate]为什么 uint8_t 和 uint16_t 的格式说明符相同 (%u)? [复制]
【发布时间】:2014-12-09 08:09:36
【问题描述】:

由于搜索 printf() 的结果很多,我只发现了非常不相关的问题。

为什么uint8_t 不指定自己的格式字符串,而其他任何类型都有?

据我了解printf(),它必须知道所提供参数的长度才能解析变量参数列表。

由于uint8_tuint16_t 使用相同的格式说明符%uprintf() 如何“知道”要处理多少字节?或者在提供uint8_t 时是否以某种方式隐式转换为uint16_t

也许我遗漏了一些明显的东西。

【问题讨论】:

  • @PaulRoub:这个问题实际上正是我提出问题的动机所在,谢谢。我错过了使用“整数促销”作为搜索关键字。

标签: c printf format-specifiers


【解决方案1】:

因为 %u 代表“无符号”,它很可能是 uint64_t 并且取决于架构。根据man 3 printf,您可能希望使用长度修饰符来获得寻求的行为,即 %hu (uint16_t) 和 %hhu (uint8_t)。

【讨论】:

  • 你的意思是 %hhu 吗?我认为长度修饰符是前缀,而不是后缀。
  • @Bram:谢谢。固定。
【解决方案2】:

printf() 是一个可变参数函数。它的可选参数(并且只有那些)根据默认参数提升(6.5.2.2.p6)得到提升。

由于您要求整数,因此在这种情况下应用整数提升,并且您提到的类型被提升为int。 (而不是 unsigned int 因为 C)

如果您在 printf() 中使用 "%u",并将其传递给 uint16_t 变量,则该函数将其转换为 int,然后转换为 unsigned int(因为您使用 %u 请求了它)然后打印出来。

【讨论】:

  • 此提升也适用于非可变函数。
  • @BasileStarynkevitch 不,它没有。
  • 非原型函数也会出现这种情况,以防 Basile 的意图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 2016-06-25
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多