58 votes

Pourquoi size_t n'est-il pas signé?

Bjarne Stroustrup a écrit dans Le Langage de Programmation C++:

L'entier non signé types sont idéales pour les utilisations qui traitent de stockage comme un tableau de bits. À l'aide d'un unsigned au lieu d'un int pour gagner un peu plus d' représenter des nombres entiers positifs est presque jamais une bonne idée. Les tentatives de s'assurer que certaines valeurs sont positives en déclarant des variables unsigned généralement être vaincu par l'implicite des règles de conversion.

size_t semble être non signé "pour gagner un peu plus de représenter des entiers positifs". Alors, c'est une erreur (ou compromis), et si oui, doit-on réduire au minimum l'utilisation de l'informatique dans notre propre code?

Un autre article de Scott Meyers est ici. Pour résumer, il ne recommande pas l'utilisation non signé dans les interfaces, que si la valeur est toujours positive ou non. En d'autres termes, même si les valeurs négatives n'ont pas de sens, vous ne devez pas nécessairement utiliser unsigned.

61voto

Cheers and hth. - Alf Points 59647

size_t n'est pas signé pour des raisons historiques.

Sur une architecture 16 bits pointeurs, tels que le "petit" modèle de programmation DOS, il serait difficile de limiter les cordes à 32 KO.

Pour cette raison, la norme exige (via plages) ptrdiff_t, la signature de la contrepartie size_t et le type de résultat de pointeur de la différence, pour être efficace 17 bits.

Ces raisons peuvent toujours s'appliquer dans certaines parties de la programmation embarquée monde.

Toutefois, elles ne s'appliquent pas aux modernes, 32-bit ou 64-bit de programmation, où un beaucoup plus important est que le malheureux implicite des règles de conversion de C et C++ pour faire des types non signés dans bug attracteurs, quand ils sont utilisés pour les nombres (et, par conséquent, des opérations arithmétiques et de l'ampleur comparisions). Avec 20-20 avec le recul, nous pouvons maintenant voir que la décision d'adopter les règles de conversion, ou, par exemple, string( "Hi" ).length() < -3 est pratiquement garantie, était plutôt stupide et irréaliste. Toutefois, cette décision signifie que dans la programmation moderne, l'adoption de types non signés pour les nombres a de graves inconvénients et aucun avantage – sauf pour satisfaire les sentiments de ceux qui trouvent unsigned à être une auto-descriptif type de nom, et ne pas penser typedef int MyType.

En résumé, il n'était pas une erreur. C'est une décision qui appartient alors de manière très rationnelle, la pratique de la programmation raisons. Il n'avait rien à voir avec le transfert des attentes des limites vérifié langages comme Pascal vers C++ (qui est une illusion, mais une très très fréquent, même si certains de ceux qui le font n'ont jamais entendu parler de Pascal).

26voto

geekosaur Points 26170

size_t est unsigned car les valeurs négatives n'ont pas de sens.

(D'après les commentaires:)

Ce n'est pas tant de s'assurer, que dire ce qui est. Quand est la dernière fois que vous avez vu une liste de taille -1? Suivez cette logique trop loin et que vous trouvez que non signés ne devrait pas exister du tout et les opérations sur les bits ne devrait pas être autorisé. – geekosaur

Plus au point: adresses, pour des raisons que vous devriez penser, ne sont pas signés. Les tailles sont générés par comparaison adresses; le traitement d'une adresse signée va faire beaucoup de mauvaises choses, et à l'aide d'une valeur signée pour le résultat sera de perdre des données de manière à ce que votre lecture de la Stroustrup citation à l'évidence pense que c'est acceptable, mais en fait ne l'est pas. Peut-être que vous pouvez expliquer ce qu'est un négatif adresse doit faire à la place. – geekosaur

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