Авторы Стандарта, как правило, не пытаются явно предписывать поведение в каждом возможном угловом случае, особенно когда есть очевидное правильное поведение, которое разделяют 100% всех реализаций, и нет никаких оснований ожидать, что любая реализация будет делать что-нибудь еще. Несмотря на явное требование Стандарта о том, что подписанные и неподписанные типы имеют совпадающие представления памяти для значений, подходящих для обоих, теоретически было бы возможно для реализации передать их по-разному. Стандарт не запрещает такое поведение, но я не вижу доказательств того, что авторы намеренно это разрешают. Скорее всего, они просто не рассматривали такую возможность, поскольку ни одна из реализаций (и насколько я знаю, никогда) не работала таким образом.
Вероятно, было бы разумно, чтобы дезинфицирующая реализация вызывала, если код использует% x для значения со знаком, хотя реализация качественной дезинфекции также должна обеспечивать возможность молча принимать такой код. У здравомыслящих реализаций нет причин делать что-либо кроме обработки переданного значения как unsigned или squawk, если оно используется в режиме диагностики / очистки. Хотя стандарт может запретить реализации считать недостижимым любой код, использующий% x для подписанного значения, любой, кто считает, что реализации должны воспользоваться такой свободой, должен быть признан идиотом.
Программистам, которые нацелены исключительно на здравые недиагностические реализации, не нужно беспокоиться о добавлении приведений при выводе таких вещей, как значения «uint8_t», но те, чей код может быть передан в дебильные реализации, могут захотеть добавить такие приведения, чтобы предотвратить компиляцию от "оптимизаций" могут быть навязаны такие реализации.