Недавно я прочитал, что
unsigned char x=1;
printf("%u",x);
вызывает поведение undefined, поскольку из-за спецификатора формата% u printf ожидает беззнаковый int. Но все же я хотел бы понять, что происходит в этом примере.
Я думаю, что интегральные правила продвижения действуют с выражением printf("%u",x)
и значение, представленное x
.
A.6.1 Интеграционное продвижение
Символ, короткое целое или целочисленное битовое поле, все либо подписанные, либо нет, или объект типа перечисления, может использоваться в выражении везде, где может использоваться целое число. Если int может представлять все значения исходного типа, тогда значение преобразуется to int; в противном случае значение преобразуется в unsigned int. Этот процесс называется интегральным продвижение по службе.
Что означает "может быть использовано" здесь? Означает ли это, что "является синтаксически правильным" или "определено поведение"?
И как x продвигается в этом примере? Я прочитал, что он продвигается до int, но если printf("%u", (int x))
все еще undefined поведение, то я действительно не понимаю, почему...