Это относится к правилам целочисленного продвижения .В любое время, когда целое значение с типом, меньшим int
(т. Е. char
, short
), используется в контексте, где можно использовать int
, значение повышается до int
.
В случае с переменной функцией тип аргументов функции неизвестен во время компиляции, поэтому применяется это повышение.
Например, предположим, что у вас были следующие функции:
void f1(char c);
void f2(int count, ...);
Они называются так:
char x = 1;
f1(x); // x is passed as char
f2(1, x); // x is passed as int
Это поведение описано в разделе 6.3.1.1p2 стандарта C :
Следующее может использоваться в выражении везде, где могут использоваться int или unsigned int:
- Объект или выражение с целочисленным типом (отличным от int или unsigned int), чей ранг целочисленного преобразования меньше чемили равно рангу int и unsigned int.
- Битовое поле типа _Bool, int, sign int или unsigned int.
Если int может представлять все значения исходного типа (как ограничено шириной для битового поля), значение преобразуется в int;в противном случае он конвертируется в беззнаковое целое.Они называются целочисленными акциями.Все остальные типы не изменяются целочисленными акциями.