Помимо %hn
и %hhn
(где h
или hh
указывает размер объекта , на который указывает ), какова точка h
и hh
модификаторы для printf
спецификаторов формата?
Из-за повышений по умолчанию, которые требуются стандартом для применения к функциям с переменным числом, невозможно передать аргументы типа char
или short
(или любые их варианты со знаком / без знака) в printf
.
Согласно 7.19.6.1 (7), модификатор h
:
Указывает, что следующий спецификатор преобразования d, i, o, u, x или X применяется к
короткий int или неподписанный короткий int аргумент (аргумент будет
были продвинуты в соответствии с целочисленными акциями, но его значение
быть преобразованным в short int или unsigned short int перед печатью);
или что следующий n спецификатор преобразования применяется к указателю на короткий
int аргумент.
Если аргумент на самом деле был типа short
или unsigned short
, то повышение до int
с последующим преобразованием обратно в short
или unsigned short
приведет к тому же значению , что и повышение на int
без конвертации обратно. Таким образом, аргументы типа short
или unsigned short
, %d
, %u
и т. Д. Должны давать идентичные результаты для %hd
, %hu
и т. Д. (И аналогично для char
типов и * 1039). *).
Насколько я могу судить, единственная ситуация, когда модификатор h
или hh
может быть полезен, - это когда аргумент передал ему значение int
вне диапазона short
или unsigned short
, например
printf("%hu", 0x10000);
но я понимаю, что передача неправильного типа, подобного этому, в любом случае приводит к неопределенному поведению, так что вы не можете ожидать, что он напечатает 0.
Один случай из реальной жизни, который я видел, - это такой код:
char c = 0xf0;
printf("%hhx", c);
, где автор ожидает, что он напечатает f0
, несмотря на то, что реализация имеет простой тип char
со знаком (в этом случае printf("%x", c)
будет печатать fffffff0
или подобное). Но оправдано ли это ожидание?
(Примечание. То, что происходит, заключается в том, что исходный тип был char
, который переводится в int
и преобразуется обратно в unsigned char
вместо char
, что приводит к изменению значения, которое выводится на печать. стандарт определяет это поведение, или это детали реализации, на которые может полагаться сломанное программное обеспечение?)