Quand utiliser des valeurs non signées sur les signées?

voix
66

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

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

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

Je sais que Java ne dispose pas de valeurs non signées, et qui doit avoir été une décision sur concious Sun Microsystems part de.

Créé 02/08/2008 à 04:34
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
61

Je suis heureux de trouver une bonne conversation sur ce sujet, comme je ne l' avais pas vraiment beaucoup réfléchi avant.

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

Si vous allez faire des choses comme des masques de bits, commence non signés plus de sens. Ou, si vous êtes désespéré pour obtenir cette plage positive supplémentaire en tirant profit 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).

Créé 02/08/2008 à 04:49
source utilisateur

voix
8

Dans votre exemple ci-dessus, lorsque « i » toujours positive et une gamme plus élevée serait bénéfique, non signé serait utile. Comme si vous utilisez des déclarations «de déclaration, et notamment:

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

Surtout quand ces valeurs ne changeront jamais.

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

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

Créé 02/08/2008 à 05:31
source utilisateur

voix
7

Je pense que si votre cas d'affaires dicte qu'un chiffre négatif est invalide, vous voulez avoir une erreur affiché ou jeté.

Dans cet esprit, je viens seulement récemment découvert des entiers non signés tout en travaillant sur un traitement des données du projet dans un fichier binaire et stocker les données dans une base de données. J'étais volontairement « corruptrice » les données binaires, et a fini par obtenir des valeurs négatives au lieu d'une erreur attendue. Je trouve que même si la valeur convertie, la valeur n'a pas été valable pour mon cas d'affaires.
Mon programme n'a pas l' erreur, et je fini par obtenir des données erronées dans la base de données. Il aurait été mieux si je l' avais utilisé uintet avait le programme échouent.

Créé 10/11/2008 à 20:04
source utilisateur

voix
7

C et compilateurs C + va générer un avertissement lorsque vous comparez signé et types non signés; dans votre code exemple, vous ne pouvez rendre votre variable de boucle non signé et que le compilateur de générer du code sans avertissement (à supposer que dit avertissements ont été activés).

Bien entendu, vous compilez avec des avertissements tourné tout le chemin, non?

Et, avez-vous envisagé la compilation avec « Traiter les avertissements comme des erreurs » pour prendre un peu plus loin?

L'inconvénient à l'utilisation des nombres signés est qu'il ya une tentation de les surcharger de sorte que, par exemple, les valeurs 0-> n sont la sélection de menu, et ne signifie rien est sélectionné -1 - plutôt que de créer une classe qui a deux variables, un à indiquer si quelque chose est sélectionné et un autre pour stocker ce que la sélection est. Avant que vous le sachiez, vous testez pour un négatif dans tous les sens et le compilateur se plaint de la façon dont vous êtes désireux de comparer la sélection de menu en fonction du nombre de sélections de menu que vous avez - mais c'est dangereux parce qu'ils sont différents types . Donc, ne pas le faire.

Créé 04/08/2008 à 14:35
source utilisateur

voix
6

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

Créé 02/08/2008 à 06:51
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more