Согласно стандарту C (6.5.2.2 параграф 6)
Если выражение, обозначающее вызываемую функцию, имеет тип, не включающий прототипа, целочисленные рекламные акции выполняются для каждого аргумента, а аргументы, которые имеют тип float повышаются до double. Они называются аргументом по умолчанию промо акции. Если количество аргументов не равно количеству параметров, поведение не определено. Если функция определена с типом, который включает прототип, и либо прототип заканчивается многоточием (, ...), либо типы аргументов после продвижение несовместимо с типами параметров, поведение не определено. Если функция определена с типом, который не включает прототип, и типы аргументы после продвижения несовместимы с аргументами после продвижение, поведение не определено, за исключением следующих случаев:
- один продвинутый тип - это целочисленный тип со знаком, другой продвинутый тип - это соответствующий беззнаковый целочисленный тип, и значение может быть представлено в обоих типах;
- оба типа являются указателями на квалифицированные или неквалифицированные версии символьного типа или void.
Таким образом, в общем, нет ничего плохого в передаче int
вариативной функции, которая ожидает unsigned int
(или наоборот), пока передается значение подходит для обоих типов. Однако спецификация для printf
гласит (7.19.6.1 параграф 9):
Если спецификация преобразования недопустима, поведение не определено. Если какой-либо аргумент неправильный тип для соответствующей спецификации преобразования, поведение undefned.
Никаких исключений для несоответствия знак / без знака не делается.
Означает ли это, что printf ("% x", 1)
вызывает неопределенное поведение?