printf()
фактически не ожидает, что аргумент будет short
, когда вы используете %hi
.Когда вы вызываете функцию с переменным числом аргументов, все аргументы проходят продвижение аргумента по умолчанию .В случае целочисленных аргументов это означает целочисленные продвижения, что означает, что все целочисленные типы, меньшие чем int
, преобразуются в int
или unsigned int
.
Если соответствующий аргумент является литералом, все этотребуется, чтобы это значение вписывалось в short
, вам на самом деле не нужно приводить его к short
.
стандарт раздел 7.21.6.1.7объясняет это так:
аргумент будет повышен в соответствии с целочисленными повышениями, но его значение должно быть преобразовано в short int
или unsigned short int
перед печатью