c - que - posix threads
¿Cuál es la diferencia entre ssize_t y ptrdiff_t? (2)
¿Hay una implementación donde el tipo de base subyacente para ssize_t no es el mismo que para ptrdiff_t?
x86-16 con el modelo de memoria grande. Los punteros están lejos (32 bits), pero los objetos individuales están limitados a un segmento (por lo que size_t
puede tener 16 bits).
El estándar C (ISO / IEC 9899: 2011 o 9899: 1999) define un tipo ptrdiff_t
en <stddef.h>
.
El estándar POSIX (ISO / IEC 9945; IEEE Std 1003.1-2008) define un tipo ssize_t
en <sys/types.h>
.
- ¿Cuál es la diferencia entre estos tipos (o por qué ambos se consideraron necesarios)?
- ¿Hay una implementación donde el tipo de base subyacente para
ssize_t
no es el mismo que paraptrdiff_t
?
El documento Open Group Base Specifications Issue 7, IEEE Std 1003.1, 2013 Edition, description of <sys/types.h>
dice:
El tipo ssize_t es capaz de almacenar valores al menos en el rango [-1, SSIZE_MAX].
En otras palabras, ssize_t
está firmado, pero el conjunto de valores negativos que puede representar puede limitarse a solo {-1}.
Un ptrdiff_t
, por otro lado, garantiza tener un rango positivo / negativo más simétrico.
Admito que, en la práctica, no parece probable que ssize_t
sea tan limitado en el rango negativo, pero es posible.
Por supuesto, otra diferencia es que ptrdiff_t
está disponible siempre que esté programando en C o C ++ estándar, pero ssize_t
puede no estar disponible a menos que tenga como objetivo un sistema POSIX estándar.