除了%hn和%hhn(其中h或hh指定指向对象的大小),printf格式说明符的h和hh修饰符的点是什么?
由于标准需要应用于可变函数的默认升级,不可能将类型char或short(或其任何有符号/无符号变体)的参数传递给printf。
根据7.19.6.1(7),h修改量:
Specifies that a following d, i, o, u, x, or X conversion specifier applies to a
short int or unsigned short int argument (the argument will
have been promoted according to the integer promotions, but its value shall
be converted to short int or unsigned short int before printing);
or that a following n conversion specifier applies to a pointer to a short
int argument.
如果参数实际上是短类型或无符号短整型,那么晋升到int后跟一个转换回短或无符号短整型将产生与晋升到int相同的值,而不进行任何转换。因此,对于短型或无符号短型的参数,%d,%u等应给出与%hd,%hu等相同的结果(对于char类型和hh同样如此)。
就我可以告诉,h或hh修饰符可能有用的唯一情况是当参数传递一个int在短或无符号短的范围之外,例如。
printf("%hu", 0x10000);
但我的理解是,传递错误的类型像这样导致未定义的行为反正,所以你不能指望它打印0。
我看到的一个现实世界的情况是这样的代码:
char c = 0xf0;
printf("%hhx", c);
其中作者期望它打印f0,尽管实现具有签名的纯文本类型(在这种情况下,printf(“%x”,c)将打印fffffff0或类似)。但是这种期望是否值得?
(注意:发生了什么是原来的类型是char,它被提升为int并转换回unsigned char而不是char,从而改变打印的值,但是标准指定了这个行为,或者是一个实现破损软件可能依赖的详细信息?)