据我所知,%hhu格式说明符应该有一个无符号字符的范围。然而,在我测试它的一些编译器中,它似乎有一个无符号短的范围。有什么原因吗?我尝试使用%hhu打印,例如,65535。我希望打印255,假设值将被转换为无符号字符。然而在CodeBlocks和Tiny C Compiler中,我得到的是65535。如果我尝试打印65536,它会打印0,正如我所期望的那样,如果我使用%hu(带一个h)。然而,在OnlineGDB中,我得到了我所期望的行为。
fivyi3re1#
使用*printf()、"%hh":...指定以下B、d、i、o、u、x或X转换说明符应用于signed char或unsigned char参数(参数将根据整数提升进行提升,但其值应在打印前转换为signed char或unsigned char);... C23dr § 7.23.6.1 7当打印unsigned char范围之外的值时,怀疑错误是合理的。[编辑]另一方面,"hh"被指定与signed char或unsigned char参数一起使用。由于OP没有这样做,结果是 undefined behavior(UB)。如果任何参数不是相应转换规范的正确类型,则行为未定义。§ 7.23.6.1 9
*printf()
"%hh"
signed char
unsigned char
"hh"
1条答案
按热度按时间fivyi3re1#
使用
*printf()
、"%hh"
:...指定以下B、d、i、o、u、x或X转换说明符应用于
signed char
或unsigned char
参数(参数将根据整数提升进行提升,但其值应在打印前转换为signed char
或unsigned char
);... C23dr § 7.23.6.1 7当打印
unsigned char
范围之外的值时,怀疑错误是合理的。[编辑]
另一方面,
"hh"
被指定与signed char
或unsigned char
参数一起使用。由于OP没有这样做,结果是 undefined behavior(UB)。如果任何参数不是相应转换规范的正确类型,则行为未定义。§ 7.23.6.1 9