Quand utiliser des valeurs non signées par rapport à des valeurs signées?

Quand est-il approprié d'utiliser une variable non signée sur une variable signée? Qu'en est-il dans une boucle for ?

J'entends beaucoup d'opinions à ce sujet et je voulais voir s'il y avait quelque chose ressemblant à un consensus.

for (unsigned int i = 0; i < someThing.length(); i++) {  
    SomeThing var = someThing.at(i);  
    // You get the idea.  
}

Je sais que Java n'a pas de valeurs non signées, et cela a dû être une décision consciencieuse sur Sun Microsystems ' partie.

0
ajouté édité
Vues: 2
ajouté l'auteur mk12, source
Je pense que cette question est basée sur l'opinion. Le code présenté fonctionnera très bien dans les deux cas, vous pouvez donc utiliser les deux. Sauf pour des raisons de performances (aucune réponse ne traite actuellement des performances), c'est juste un goût personnel.
ajouté l'auteur Trilarion, source

5 Réponses

J'étais heureux de trouver une bonne conversation à ce sujet, car je n'y avais pas vraiment réfléchi auparavant.

En résumé, signé est un bon choix général - même si vous êtes sûr que tous les nombres sont positifs - si vous allez faire de l'arithmétique sur la variable (comme dans un cas de boucle typique).

Si vous allez faire des choses comme des masques, les non signés commencent à avoir plus de sens. Ou, si vous êtes désespéré d'obtenir cette gamme positive supplémentaire en profitant du bit de signe.

Personnellement, j'aime bien signé car je ne me fais pas confiance pour rester cohérent et éviter de mélanger les deux types (comme le met en garde l'article).

0
ajouté
Plus tard dans ce thread, il est montré que unsigned est largement supérieur pour détecter les débordements dans les entrées non fiables. Malheureusement, les "réponses" proposées au puzzle ne sont pas si bonnes. La mienne est un template bool_check_sum (unsigned a, unsigned b) {return (une Si quelqu'un a une réponse similaire simple et directe en utilisant des types signés, j'aimerais le voir.
ajouté l'auteur Ben Voigt, source

size_t is often a good choice for this, or size_type if you're using an STL class.

0
ajouté
Seulement quand vous avez affaire à la taille de quelque chose en octets.
ajouté l'auteur mk12, source

Dans votre exemple ci-dessus, quand «je» sera toujours positif et qu'une gamme plus élevée serait bénéfique, un non signé serait utile. Comme si vous utilisiez des déclarations 'declare', telles que:

#declare BIT1 (unsigned int 1)
#declare BIT32 (unsigned int reallybignumber)

Surtout quand ces valeurs ne changeront jamais.

Cependant, si vous faites un programme de comptabilité où les gens sont irresponsables avec leur argent et sont constamment dans le rouge, vous voudrez certainement utiliser «signé».

Je suis d'accord avec saint, cependant, une bonne règle est d'utiliser signé, ce qui est par défaut C, donc vous êtes couvert.

0
ajouté

Les compilateurs C et C ++ génèrent un avertissement lorsque vous comparez des types signés et non signés; Dans votre exemple de code, vous ne pouvez pas rendre votre variable de boucle non signée et demander au compilateur de générer du code sans avertissement (en supposant que les avertissements ont été activés).

Naturellement, vous compilez avec des avertissements tout le chemin, non?

Et, avez-vous envisagé de compiler avec «traiter les avertissements comme des erreurs» pour aller encore plus loin?

The downside with using signed numbers is that there's a temptation to overload them so that, for example, the values 0->n are the menu selection, and -1 means nothing's selected - rather than creating a class that has two variables, one to indicate if something is selected and another to store what that selection is. Before you know it, you're testing for negative one all over the place and the compiler is complaining about how you're wanting to compare the menu selection against the number of menu selections you have - but that's dangerous because they're different types. So don't do that.

0
ajouté

Je pense que si votre business case dicte qu'un nombre négatif est invalide, vous voudriez vouloir avoir une erreur affichée ou lancée.

Dans cet esprit, je viens tout juste de découvrir des entiers non signés tout en travaillant sur un projet traitant des données dans un fichier binaire et stockant les données dans une base de données. J'ai délibérément "corrompu" les données binaires, et fini par obtenir des valeurs négatives au lieu d'une erreur attendue. J'ai découvert que même si la valeur était convertie, la valeur n'était pas valide pour mon analyse de rentabilisation.
Mon programme n'a pas d'erreur, et j'ai fini par obtenir des données erronées dans la base de données. Il aurait mieux valu que j'utilise uint et que le programme échoue.

0
ajouté