Question

Quand est-il approprié d’utiliser une variable non signée plutôt qu’une variable signée ?Et dans un for boucle?

J'entends beaucoup d'opinions à ce sujet et je voulais voir s'il y avait quelque chose qui ressemblait à 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. Microsystèmes Sun' partie.

Était-ce utile?

La solution

J'étais heureux de trouver une bonne conversation sur 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 lorsque vous êtes sûr que tous les nombres sont positifs - si vous comptez faire de l'arithmétique sur la variable (comme dans un cas typique de boucle for).

Si vous envisagez de faire des choses au niveau du bit comme des masques, non signé commence à avoir plus de sens.Ou, si vous souhaitez désespérément obtenir cette plage positive supplémentaire en profitant du bit de signe.

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

Autres conseils

Dans votre exemple ci-dessus, lorsque « i » sera toujours positif et qu’une plage plus élevée serait bénéfique, unsigned serait utile.Comme si vous utilisez des instructions « declare », telles que :

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

Surtout quand ces valeurs ne changeront jamais.

Cependant, si vous utilisez un programme de comptabilité dans lequel les gens sont irresponsables avec leur argent et sont constamment dans le rouge, vous souhaiterez certainement utiliser « signé ».

Je suis cependant d'accord avec saint qu'une bonne règle générale consiste à utiliser signé, ce que C utilise par défaut, vous êtes donc couvert.

Les compilateurs C et C++ génèrent un avertissement lorsque vous comparez les 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 avertissements (en supposant que lesdits avertissements soient activés).

Naturellement, vous compilez des avertissements au maximum, n'est-ce pas ?

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

L'inconvénient de l'utilisation de nombres signés est qu'il est tentant de les surcharger de sorte que, par exemple, les valeurs 0->n correspondent à la sélection du menu et -1 signifie que rien n'est sélectionné - plutôt que de créer une classe comportant deux variables, une pour indiquez si quelque chose est sélectionné et un autre pour stocker quelle est cette sélection.Avant de vous en rendre compte, vous testez un résultat négatif partout et le compilateur se plaint de la façon dont vous souhaitez comparer la sélection de menu avec le nombre de sélections de menu dont vous disposez - mais c'est dangereux car ce sont des types différents. .Alors ne fais pas ça.

Je pense que si votre analyse de rentabilisation indique qu'un nombre négatif n'est pas valide, vous le feriez vouloir pour qu'une erreur soit affichée ou renvoyée.

Dans cet esprit, j'ai récemment découvert les entiers non signés alors que je travaillais sur un projet traitant des données dans un fichier binaire et stockant les données dans une base de données.J'étais volontairement "corrompu" les données binaires et j'ai fini par obtenir des valeurs négatives au lieu d'une erreur attendue.J'ai constaté que même si la valeur était convertie, elle n'était pas valide pour mon analyse de rentabilisation.
Mon programme n'a généré aucune erreur et j'ai fini par obtenir des données erronées dans la base de données.Cela aurait été mieux si j'avais utilisé uint et le programme a échoué.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top