Скажем, я хочу напечатать unsigned char
:
unsigned char x = 12;
что является правильным. Это:
printf("%d",x);
или это:
printf("%u",x);
?
Дело в другом месте в SO Я столкнулся с таким обсуждением:
-Если с ch изменено на unsigned char, поведение кода не определяется стандартом C. Это связано с тем, что unsigned char продвигается до int (в нормальных реализациях C), поэтому int передается printf для спецификатора% u. Тем не менее,% u ожидает unsigned int, поэтому типы не совпадают, а стандарт C не определяет поведение
- Ваш комментарий неверен. В стандарте C11 указано, что спецификатор преобразования должен быть того же типа, что и сам аргумент функции, а не продвинутый тип. Этот пункт также специально рассматривается в описании модификатора длины hh: "аргумент будет продвигаться в соответствии с целыми рекламными акциями, но его значение должно быть преобразовано в подписанный char или без знака char перед печатью"
Итак, что правильно? Любой надежный источник, говорящий по этому поводу? (В этом смысле мы также должны печатать unsigned short
int с% d, потому что его можно повысить до int
?).