47 votes

Quelle est la différence entre ssize_t et ptrdiff_t ?

La norme C (ISO/IEC 9899:2011 ou 9899:1999) définit un type ptrdiff_t sur <stddef.h> .

La norme POSIX (ISO/IEC 9945 ; IEEE Std 1003.1-2008) définit un type ssize_t sur <sys/types.h> .

  • Quelle est la différence entre ces types (ou pourquoi les deux ont-ils été jugés nécessaires) ?
  • Existe-t-il une implémentation où le type de base sous-jacent pour les ssize_t n'est pas la même que pour ptrdiff_t ?

32voto

dan04 Points 33306

Existe-t-il une implémentation où le type de base sous-jacent pour ssize_t n'est pas le même que celui de ptrdiff_t ?

x86-16 avec le modèle de grande mémoire. Les pointeurs sont éloignés (32 bits), mais les objets individuels sont limités à un seul segment (donc size_t est autorisé à être de 16 bits).

26voto

Adrian McCarthy Points 17018

Spécifications de base de l'Open Group numéro 7, IEEE Std 1003.1, édition 2013, description de <sys/types.h> dit :

Le type ssize_t est capable de stocker des valeurs au moins dans la plage [-1, SSIZE_MAX].

En d'autres termes, ssize_t est signé, mais l'ensemble des valeurs négatives qu'il peut représenter peut être limité à {-1}.

A ptrdiff_t En revanche, il est garanti que la plage positive/négative est plus symétrique.

J'admets qu'en pratique, il ne semble pas probable que ssize_t serait aussi limitée dans la gamme négative, mais c'est possible.

Bien sûr, une autre différence est que ptrdiff_t est disponible chaque fois que vous programmez en C ou C++ standard, mais ssize_t peut ne pas être disponible à moins que vous ne cibliez un système POSIX standard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X