printf буквенное число (int), ожидая более короткое число - PullRequest
1 голос
/ 09 мая 2019

Допустим, у нас есть эта строка кода:

printf("%hi", 6);

Предположим, sizeof(short) == 2 и sizeof(int) == 4.

printf ожидает short, но получает int, что шире. Это неопределенное поведение?

То же самое с %hhi.

1 Ответ

2 голосов
/ 09 мая 2019

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

Если соответствующий аргумент является литералом, все этотребуется, чтобы это значение вписывалось в short, вам на самом деле не нужно приводить его к short.

стандарт раздел 7.21.6.1.7объясняет это так:

аргумент будет повышен в соответствии с целочисленными повышениями, но его значение должно быть преобразовано в short int или unsigned short int перед печатью

...