use*_*ser 2 c c++ printf language-lawyer
例如,这样的代码可能很有用:
unsigned char ch = 0xf2;
printf("%02hhx", ch);
Run Code Online (Sandbox Code Playgroud)
但是,在作为可变参数函数的参数传递时ch被提升为。所以当使用时,存在类型不匹配。根据 C 标准,这里是否涉及任何未定义的行为?如果是C++呢?intprintf%hhx
这里有一些讨论,但没有给出答案。
C11标准说:
7.21.6.1/7
hh指定后面的d,i,o,u,x, 或X转换说明符适用于有符号字符或无符号字符参数(该参数将根据整数提升进行提升,但其值应转换为有符号字符或无符号字符打印前的字符);或者后面的 n 转换说明符适用于指向有符号字符参数的指针。
所以不,没有未定义的行为。该标准很清楚,char可变参数函数的参数将被提升为int.