141 votes

Convertir un nombre positif en négatif en C#

Vous pouvez convertir un nombre négatif en positif comme ceci :

int myInt = System.Math.Abs(-5);

Existe-t-il une méthode équivalente pour rendre un nombre positif négatif ?

0 votes

3 votes

280Z28 : C'est équivalent à myInt = -1.

1 votes

Doit être monInt |= int.MinValue ;

563voto

bryanbcook Points 7184

Et si

myInt = myInt * -1

72 votes

Cette solution est géniale car elle peut également convertir les négatifs en positifs ! Génial !

25 votes

J'avais l'impression qu'on pouvait simplement mettre un "-" devant n'importe quoi pour le nier... -myInt Ce serait le négatif de la valeur de myInt... -ABS(monInt) serait un négatif garanti.

16 votes

Qu'en est-il myInt = - Myint ?

279voto

Jim W Points 3050
int myNegInt = System.Math.Abs(myNumber) * (-1);

38 votes

+1 pour s'être rappelé que si c'est déjà un négatif, vous aurez l'effet inverse. Votre réponse est la seule qui donnerait toujours un nombre négatif, que le myNumber soit positif ou négatif.

0 votes

Seulement 26 votes pour cette réponse ? Y a-t-il des utilisateurs de SO qui pensent que cela ne fonctionnerait pas ?

8 votes

30 votes positifs ? La question est déjà si simple. Et cette réponse trop compliquée (-System.Math.Abs(myNumber) ferait également l'affaire) obtient 30 votes positifs ????.

146voto

JDunkerley Points 7237
int negInt = -System.Math.Abs(myInt)

11 votes

Oui, parce que la négation est le but, donc un moins unaire est le bon opérateur. D'un autre côté, multiplier par un négatif est juste une astuce pour nier une valeur.

38 votes

C'est une astuce parce qu'elle compte sur un effet secondaire, pas sur l'effet principal. L'effet primaire du moins unaire est de nier. L'effet primaire de la multiplication est de multiplier. Il se trouve que la multiplication par -1 annule. Est-ce que c'est plus clair ?

5 votes

@StevenSudit Non, pas plus beau que * -1. Multiplier par -1 n'est pas "un truc", c'est la façon mathématique de rendre un nombre négatif. -Nombre est juste un raccourci de -1*Nombre. En outre, l'utilisation de Abs pour garder le nombre négatif est une surenchère. myInt<0 ? myInt : -myInt; est bien meilleur. Ce n'est pas parce que l'opérateur - est fourni en tant que raccourci de l'opérateur -1*Nombre plus les capacités de surcharge, que * (-1) est une astuce.

104voto

Joe White Points 32629

De la même manière que vous rendez toute autre chose négative : mettez un signe négatif devant.

var positive = 6;
var negative = -positive;

9 votes

Tout le monde oublie le moins unaire.

0 votes

Quelle est la différence pratique entre cette réponse et celle-ci ? stackoverflow.com/questions/1348080/ int myNegInt = System.Math.Abs(myNumber) * (-1);

0 votes

@makerofthings7, celui dont vous avez donné le lien comporte beaucoup plus d'instructions CPU - une opération de valeur absolue (au moins). trois instructions sur x86), suivi d'un MUL (ou éventuellement d'un NEG si le compilateur est malin). Cette réponse est un opcode NEG unique et léger, ni plus ni moins que ce dont vous avez besoin. Bien sûr, les deux réponses se comportent différemment lorsque le nombre d'entrée est déjà négatif ; si (contrairement à cette question) votre entrée peut être négative, cela prend la décision pour vous.

45voto

Mehrdad Afshari Points 204872

Note à tous ceux qui ont répondu avec

- Math.Abs(myInteger)

ou

0 - Math.Abs(myInteger)

ou

Math.Abs(myInteger) * -1

comme un moyen de garder les nombres négatifs négatifs et de rendre les positifs négatifs.

Cette approche présente un seul défaut. Elle ne fonctionne pas pour tous les entiers. L'intervalle de Int32 Le type est de "-2 31 "en "2 31 - 1." Cela signifie qu'il y a un nombre "négatif" de plus. Par conséquent, Math.Abs(int.MinValue) lance un OverflowException .

La bonne méthode consiste à utiliser des instructions conditionnelles :

int neg = n < 0 ? n : -n;

Cette approche fonctionne pour "tous" les entiers.

0 votes

Je vous laisse le point pour la correction, mais tout code qui dépend du fait que personne ne prenne l'Abs de MinValue est fragile.

0 votes

Steven : Parfois, tu résous un problème (comme Abs ) qui ne peut pas fonctionner pour int.MinValue (en supposant que int type de retour). Dans ce cas, il est tout à fait acceptable de lever une exception. Cependant, ce problème spécifique a un résultat "valide" pour les éléments suivants int.MinValue mais lève une exception si vous prenez le Abs route.

0 votes

Après avoir dit que l'échelle négative est plus grande que l'échelle positive, vous proposez ensuite un code qui ne tient pas compte de ce fait. Si n est -32768 puis -n est AUSSI -32768 ! !! En outre, int neg = n < 0 ? n : -n; ne peut pas fonctionner dans tous les cas, car l'un des ternaires ne fait absolument rien.

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