В чем разница между ssize_t и ptrdiff_t? - PullRequest
38 голосов
/ 28 декабря 2011

Стандарт C (ISO / IEC 9899: 2011 или 9899: 1999) определяет тип ptrdiff_t in <stddef.h>.

Стандарт POSIX (ISO / IEC 9945; IEEE Std 1003.1-2008)определяет тип ssize_t в <sys/types.h>.

  • В чем разница между этими типами (или почему оба были сочтены необходимыми)?
  • Существует ли реализация, в которой базовая базатип для ssize_t отличается от типа ptrdiff_t?

Ответы [ 2 ]

27 голосов
/ 28 декабря 2011

Есть ли реализация, где базовый базовый тип для ssize_t не то же самое что и для ptrdiff_t?

x86-16 с большой моделью памяти. Указатели находятся далеко (32-битные), но отдельные объекты ограничены одним сегментом (поэтому size_t может быть 16-битным).

21 голосов
/ 04 июня 2012

Базовые спецификации Open Group Issue 7, IEEE Std 1003.1, издание 2013 г., описание <sys/types.h> говорит:

Тип ssize_t способен хранить значения как минимумв диапазоне [-1, SSIZE_MAX].

Другими словами, ssize_t подписано, , но набор отрицательных значений, которые он может представлять, может быть ограничен просто {-1}.

А ptrdiff_t, с другой стороны, гарантированно имеет более симметричный положительный / отрицательный диапазон.

Я признаю, что на практике это маловероятночто ssize_t будет таким ограниченным в отрицательном диапазоне, но это возможно.

Конечно, другое отличие состоит в том, что ptrdiff_t доступен, когда вы программируете на стандартном C или C ++, но ssize_t может быть недоступно, если вы не используете стандартную систему POSIX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...