вопрос о несовместимых спецификаторах формата printf

StackOverflow https://stackoverflow.com/questions/703192

  •  22-08-2019
  •  | 
  •  

Вопрос

Я просто просматривал справочную страницу для 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 типы
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top