В функциях с переменным числом аргументов происходит повышение аргументов по умолчанию.
6.5.2.2.6 Если выражение, обозначающее вызываемую функцию, имеет тип, который не включает прототип, для каждого аргумента выполняется целочисленное повышение, а аргументы, имеющие тип
float
, повышаются доdouble
. Они называются повышениями аргументов по умолчанию. [...]
6.5.2.2.7 [...] Обозначение с многоточием в деклараторе прототипа функции приводит к остановке преобразования типа аргумента после последнего объявленного параметра. Продвижение аргументов по умолчанию выполняется для завершающих аргументов.
Следовательно,
signed char c = 123;
int i = 123;
float f = 123;
double d = 123;
printf("%d\n", i); // ok
printf("%d\n", c); // ok, even though %d expects int.
printf("%f\n", d); // ok
printf("%f\n", f); // ok, even though %f expects double.
Так почему же существует модификатор длины printf
для char
(hh
) и short
(h
)?
Номер раздела относится к N2176.
signed char
илиshort
установить самый старший бит.... - person Andrew Henle   schedule 02.07.2021printf()
отменить продвижение по умолчанию, чтобы получить исходное значениеchar
илиshort
. - person Barmar   schedule 02.07.2021signed char
илиshort
установить самый старший бит..., они прекрасно работают с%d
.(signed char)-1
и(short)-1
повышаются до(int)-1
, с чем%d
справляется отлично. Вы сделали ошибку? - person ikegami   schedule 02.07.2021scanf()
. То же самое дляl
в"%lf"
. - person chux - Reinstate Monica   schedule 02.07.2021%i
и%d
. Они делают то же самое вprintf()
, но отличаются вscanf()
. - person Barmar   schedule 02.07.2021signed int
иunsigned int
, вызывая UB, если печатались с%x
или подобным. Например, я почти уверен, что%x
не является UB, когда передаетсяsigned int
в C89. - person Andrew Henle   schedule 02.07.2021