为什么uint8_t和uint16_t的格式说明符相同(%u)?

时间:2014-10-14 13:42:56

标签: c printf format-specifiers

由于大量搜索printf()的结果,我才发现了相关的问题。

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

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

由于uint8_tuint16_t使用相同的格式说明符%uprintf()"如何知道"要处理多少字节?或者在提供uint16_t

时,是否以某种方式对uint8_t进行了隐式转换

也许我错过了一些明显的东西。

2 个答案:

答案 0 :(得分:11)

因为%u代表" unsigned",它可能是uint64_t并且取决于架构。根据{{​​1}},您可能希望使用长度修饰符来获取搜索行为,即%hu(uint16_t)和%hhu(uint8_t)。

答案 1 :(得分:6)

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

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

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