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

Translate

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

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 a dû être une décision consciente surMicrosystèmes Sun' partie.

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

J'étais content de trouverune bonne conversationsur 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 allez faire de l'arithmétique sur la variable (comme dans un cas typique de boucle for).

Si vous allez faire des choses au niveau du bit comme des masques, le non signé commence à avoir plus de sens. Ou, si vous êtes désespéré d'obtenir cette plage positive supplémentaire en tirant parti 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 met en garde contre).

La source
Translate

Dans votre exemple ci-dessus, lorsque «i» sera toujours positif et qu'une plage plus élevée serait bénéfique, non signé 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 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 qu'une bonne règle de base est d'utiliser signé, ce que C est en fait par défaut, donc vous êtes couvert.

La source
Translate

Les compilateurs C et C ++ généreront un avertissement lorsque vous comparerez des types signés et non signés; dans votre exemple de code, vous ne pouviez pas rendre votre variable de boucle non signée et demander au compilateur de générer du code sans avertissements (en supposant que ces avertissements étaient activés).

Naturellement, vous compilez avec les avertissements tournés au maximum, non?

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

L'inconvénient de l'utilisation de nombres signés est qu'il y a une tentation de les surcharger de sorte que, par exemple, les valeurs 0-> n soient la sélection de menu, et -1 signifie que rien n'est sélectionné - plutôt que de créer une classe qui a deux variables, une à indiquer si quelque chose est sélectionné et un autre pour stocker ce que cette sélection est. Avant que vous ne le sachiez, 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 au nombre de sélections de menu que vous avez - mais c'est dangereux car ce sont des types différents . Alors ne fais pas ça.

La source
Translate

Je pense que si votre analyse de rentabilisation dicte qu'un nombre négatif est invalide, vousvouloirpour afficher ou lancer une erreur.

Dans cet esprit, je n'ai découvert que récemment des entiers non signés 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'étais délibérément en train de «corrompre» les données binaires et j'ai fini par obtenir des valeurs négatives au lieu d'une erreur attendue. J'ai trouvé que même si la valeur était convertie, la valeur n'était pas valide pour mon analyse de rentabilisation.
Mon programme n'a pas fait d'erreur et j'ai fini par obtenir des données erronées dans la base de données. C'aurait été mieux si j'avais utiliséuintet le programme a échoué.

La source
Translate

size_test souvent un bon choix pour cela, ousize_typesi vous utilisez une classe STL.

La source