В чем разница между 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
?
Ответы
Ответ 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.