由于大量搜索printf()
的结果,我才发现了相关的问题。
为什么uint8_t
没有指定自己的格式字符串,但其他任何类型都没有?
据我了解printf()
,它必须知道提供的参数的长度才能解析变量参数列表。
由于uint8_t
和uint16_t
使用相同的格式说明符%u
,printf()
"如何知道"要处理多少字节?或者在提供uint16_t
uint8_t
进行了隐式转换
也许我错过了一些明显的东西。
答案 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)要求它,然后打印出来。