除了%hn
和%hhn
(其中h
或hh
指定pointed-to对象的大小)之外,printf
格式说明符的h
和hh
修饰符的意义是什么?
由于标准要求应用于可变函数的默认升级,不可能将类型char
或short
(或其任何有符号/无符号变体)的参数传递给printf
.
根据7.19.6.1(7),h
修改量:
以下d、i、o、u、x或x转换规范适用于
如果参数实际上是类型short
或unsigned short
,那么升级到int
,然后再转换回short
或unsigned short
,将产生与升级到int
相同的value,而不进行任何转换.因此,对于类型short
或unsigned short
的参数,%d
、%u
等应该给出与%hd
、%hu
等相同的结果(对于char
类型和hh
也一样).
据我所知,h
或hh
修饰符可能有用的唯一情况是参数传递给它的int
超出了short
或unsigned short
的范围,例如
printf("%hu", 0x10000);
但我的理解是,像这样传递错误的类型会导致未定义的行为,因此您不能期望它打印0.
我见过的一个实际 case 是这样的代码:
char c = 0xf0;
printf("%hhx", c);
作者期望它打印f0
,尽管实现具有签名的纯char
类型(在这种情况下,printf("%x", c)
将打印fffffff0
或类似类型).但是,这样的期望有根据吗?
(注意:实际情况是,原来的类型是char
,它被提升为int
,然后转换回unsigned char
而不是char
,从而更改了打印的值.但是该标准是否规定了此行为,或者它是损坏的软件可能依赖的实现细节吗?)