Quand utiliser des valeurs non signées sur signé chers?
Quand est-il approprié d'utiliser un unsigned variable sur une signé une? Qu'en est-il un for
boucle?
J'ai entendu beaucoup d'opinions à ce sujet et je voulais voir si 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 qui doit avoir été un soucieux de l'environnement et de la décision sur Sun Microsystems' partie.
- J'ai trouvé ce utile: codemines.blogspot.ca/2007/10/...
- Je pense que cette question est assez opinion fondée. Le code sera exécuté dans les deux cas, très bien, de sorte que vous pouvez utiliser à la fois. Sauf pour des raisons de performances (pas de réponse traite de performance à ce jour) c'est juste le goût personnel.
Vous devez vous connecter pour publier un commentaire.
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).
unsigned
est largement supérieur pour la détection de dépassement de capacité dans les entrées non sures. Malheureusement, le projet de "réponses" à des le puzzle ne sont pas tout que de grands. Le mien esttemplate<size_t limit> bool range_check_sum( unsigned a, unsigned b ) { return (a < limit) && (b < limit - a); }
Si quelqu'un a un de la même façon simple et directe de réponse à l'aide de types signés, je serais ravi de le voir.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:
En particulier 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.
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.
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 cas pour l'entreprise.
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.size_t
est souvent un bon choix, ousize_type
si vous utilisez un STL classe.size_type
membre pour le compte d'éléments, et pas seulement octets. Il doit être utilisé au lieu destd::size_t
lorsqu'ils sont disponibles, mais il est inexact de implique que tout ce qui commence parsize_t
ne peut signifier octets.