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