Подтвердить что ты не робот

В чем разница между ssize_t и ptrdiff_t?

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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