除了%hn
and %hhn
(其中h
orhh
指定了指向对象的大小),格式说明符的h
andhh
修饰符的意义是什么?printf
由于标准要求将默认提升应用于可变参数函数,因此不可能将类型char
或short
(或其任何有符号/无符号变体)的参数传递给printf
.
根据 7.19.6.1(7),h
修改器:
指定后面的 d、i、o、u、x 或 X 转换说明符适用于 short int 或 unsigned short int 参数(该参数将根据整数提升进行提升,但其值应转换为 short int或 unsigned short int 打印前);或者后面的 n 转换说明符适用于指向短 int 参数的指针。
如果参数实际上是short
or类型unsigned short
,则提升 toint
后跟转换回short
orunsigned short
将产生与提升 to相同的值int
,而没有任何转换回。因此,对于short
or类型的参数unsigned short
,%d
,%u
等应该给出与 , 等相同的结果%hd
(%hu
对于char
类型 and也是如此hh
)。
据我所知,h
orhh
修饰符可能有用的唯一情况是当参数传递给它时int
超出short
or的范围unsigned short
,例如
printf("%hu", 0x10000);
但我的理解是,像这样传递错误的类型无论如何都会导致未定义的行为,所以你不能指望它打印 0。
我见过的一个真实案例是这样的代码:
char c = 0xf0;
printf("%hhx", c);
作者希望它在哪里打印f0
尽管实现具有已char
签名的普通类型(在这种情况下,printf("%x", c)
将打印fffffff0
或类似)但这种期望是否合理?
(注意:发生的事情是原始类型是char
,它被提升int
并转换回unsigned char
而不是char
,从而更改了打印的值。但是标准是否指定了这种行为,或者它是损坏的软件可能的实现细节依赖?)