84 votes

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

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

J'entends beaucoup d'opinions à ce sujet et je voulais voir s'il y avait quelque chose qui ressemblerait à 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 doit être une décision consciente de la part de Sun Microsystems .

70voto

saint_groceon Points 2696

J'étais heureux de trouver une bonne conversation sur ce sujet, car je n'avais pas vraiment beaucoup réfléchi avant.

En résumé, signé est un bon choix, même lorsque vous êtes mort que tous les nombres sont positifs - si vous allez faire de l'arithmétique sur la variable (comme dans une boucle for type de cas).

Si vous vous apprêtez à faire au niveau du bit des choses comme des masques, unsigned commence à faire plus de sens. Ou, si vous êtes désespérés pour obtenir ce supplément de plage positive en profitant du bit de signe.

Personnellement, j'aime signé parce que je n'ai pas confiance en moi-même de rester cohérent et d'éviter de mélanger les deux types (comme l'article met en garde contre).

10voto

helloandre Points 5784

Dans l'exemple ci-dessus, lorsque " je " sera toujours positive et une gamme plus élevée serait bénéfique, non signé, serait utile. Comme, si vous êtes à l'aide de "déclarer" états, tels que:

#declare BIT1 (unsigned int 1)

Surtout lorsque ces valeurs ne changera jamais.

Toutefois, si vous êtes en train de faire un programme de comptabilité où les gens sont irresponsables, avec leur argent et sont constamment dans le rouge, vous aurez très certainement envie d'utiliser "signé".

Je suis d'accord avec saint bien qu'une bonne règle de base est d'utiliser signé, ce qui C fait, par défaut, de sorte que vous êtes couvert.

9voto

Keith Sirmons Points 2558

Je pense que si votre entreprise dicte que d'un nombre négatif n'est pas valide, vous voulez avoir une erreur affiché ou jetés.

Avec cela à l'esprit, je ne récemment découvert sur des entiers non signés, tout en travaillant sur un projet de traitement de données dans un fichier binaire et de stocker les données dans une base de données. J'ai été volontairement "corrompre" les données binaires, et finissent par obtenir des valeurs négatives au lieu d'une erreur attendue. J'ai trouvé que même si la valeur convertie, la valeur n'est pas valide pour mon étude de cas.
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 été mieux si j'avais utilisé uint et si le programme échoue.

8voto

Josh Points 4344

Compilateurs C et C++ va générer un message d'avertissement lorsque vous comparez des entiers signés et non signés; dans votre exemple de code, vous ne pouviez pas faire votre variable de boucle non signé et le compilateur génère le code sans avertissements (en supposant que dit avertissements ont été activées).

Naturellement, vous compilez avec les mises en garde transformé tout le chemin jusqu'à, droite?

Et, avez-vous pensé à la compilation avec "traiter les avertissements comme des erreurs" de le prendre un peu plus loin?

L'inconvénient avec l'aide de nombres signés est qu'il y a une tentation de la surcharge de sorte que, par exemple, les valeurs de 0->n sont au menu de sélection, et de -1 signifie que rien n'est sélectionné - plutôt que de créer une classe qui a deux variables, une pour indiquer si un élément est sélectionné et un autre pour stocker ce que la sélection est. Avant de vous le savez, vous faites des tests pour le négatif, on s'est tous sur la place et le compilateur se plaint à propos de la façon dont vous êtes désireux de comparer la sélection d'un menu en fonction du nombre de sélections de menu, vous - mais c'est dangereux parce qu'ils sont de différents types. Afin de ne pas le faire.

6voto

Mark Harrison Points 77152

size_t est souvent un bon choix pour cela, ou size_type si vous utilisez une classe STL.

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