68 votes

Pourquoi préférer le langage signé au langage non signé en C++ ?

J'aimerais mieux comprendre pourquoi choisir int plus unsigned ?

Personnellement, je n'ai jamais aimé les valeurs signées, à moins qu'elles n'aient une raison valable. Par exemple, le nombre d'éléments dans un tableau, ou la longueur d'une chaîne de caractères, ou la taille d'un bloc de mémoire, etc. Une telle valeur n'a aucune signification possible. Pourquoi préférer int alors qu'elle est trompeuse dans tous ces cas ?

Je pose cette question parce que Bjarne Stroustrup et Chandler Carruth ont tous les deux conseillé de privilégier l'utilisation de l'Internet. int plus unsigned ici (environ 12:30') .

Je comprends l'argument en faveur de l'utilisation de int plus short o long - int est la largeur de données "la plus naturelle" pour l'architecture de la machine cible.

Mais la différence entre signé et non signé m'a toujours ennuyé. Les valeurs signées sont-elles réellement plus rapides sur les architectures de processeurs modernes ? Qu'est-ce qui les rend plus rapides ?

2voto

umps Points 540

Une bonne raison à laquelle je pense est la détection des débordements.

Pour les cas d'utilisation tels que le nombre d'éléments dans un tableau, la longueur d'une chaîne de caractères ou la taille d'un bloc de mémoire, vous pouvez faire déborder un int non signé et vous ne remarquerez peut-être pas la différence, même si vous regardez la variable. S'il s'agit d'un int signé, la variable sera inférieure à zéro et clairement erronée.

Vous pouvez simplement vérifier si la variable est nulle lorsque vous voulez l'utiliser. De cette façon, vous n'avez pas à vérifier le dépassement de capacité après chaque opération arithmétique, comme c'est le cas pour les octets non signés.

2voto

franji1 Points 1436

Pour moi, en plus de tous les entiers compris entre 0 et +2 147 483 647 contenus dans l'ensemble des entiers signés et non signés sur les architectures 32 bits, il y a une plus grande probabilité que je doive utiliser -1 (ou plus petit) que +2 147 483 648 (ou plus grand).

1voto

texasbruce Points 5321

Il donne des résultats inattendus lors d'opérations arithmétiques simples :

unsigned int i;
i = 1 - 2;
//i is now 4294967295 on a 64bit machine

Il donne des résultats inattendus lors d'une simple comparaison :

unsigned int j = 1;
std::cout << (j>-1) << std::endl;
//output 0 as false but 1 is greater than -1

En effet, lors des opérations ci-dessus, les octets signés sont convertis en octets non signés, ce qui entraîne un débordement et l'obtention d'un très grand nombre.

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