вопрос о несовместимых спецификаторах формата printf
Вопрос
Я просто просматривал справочную страницу для 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-разрядной системе.
Есть ли у стандарта какое-либо мнение по этому поводу?Я полагаю, ответом будет "неопределенное поведение". Но я решил, что спрошу ;).
Решение
Здесь не на что смотреть.Код, который вы написали, является законным.
Просто некоторые факты относительно того, почему:
- все целочисленные типы со знаком имеют аналоги без знака с одинаковыми требованиями к размеру / выравниванию
ptrdiff_t
стандартом предписано иметь целочисленный тип со знаком.Следовательно, у него есть неподписанный близнец.(На самом деле, аналогичная логика применима кsize_t
также -ssize_t
это не C, а POSIX)- в
t
спецификатор длины должен работать сd
,i
,o
,u
,x
,X
типы