Я просто просматривал справочную страницу для printf, и кое-что пришло мне в голову. Мне было интересно, есть ли здесь «языковые юристы», которые могли бы ответить на относительно простой вопрос :-P.
Таким образом, модификатор 't' определяется как
Следующее целочисленное преобразование соответствует аргументу ptrdiff_t.
Итак, что должно произойти, если вы объедините это с преобразованием целого числа без знака? Очевидно, что все o,u,x и X предназначены для интерпретации как значения без знака, тогда как d и i являются знаковыми.
Точно так же существуют подписанные/беззнаковые версии для всех модификаторов (int/unsigned int, size_t
/ssize_t
и т. д.), кроме ptrdiff_t
.
На практике ничего страшного не происходит, так как неподписанные версии типов занимают столько же места, сколько и подписанные версии. Таким образом, правое количество байтов выталкивается из стека.
Так что ничего «плохого» не происходит, на самом деле выводит ожидаемое значение для всех протестированных вещей, кроме «INT_MIN
» (при условии, что sizeof(int) == sizeof(ptrdiff_t)
.
printf("%tu %td\n", INT_MIN, INT_MIN);
отпечатки
2147483648 -2147483648
на 32-битной системе.
Есть ли мнение стандарта по этому поводу? Я полагаю, что ответ будет "неопределенное поведение". Но я решил спросить ;).