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 ?
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 ?
Cette solution est géniale car elle peut également convertir les négatifs en positifs ! Génial !
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.
+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.
Seulement 26 votes pour cette réponse ? Y a-t-il des utilisateurs de SO qui pensent que cela ne fonctionnerait pas ?
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 ????.
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.
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 ?
@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.
Quelle est la différence pratique entre cette réponse et celle-ci ? stackoverflow.com/questions/1348080/ int myNegInt = System.Math.Abs(myNumber) * (-1);
@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.
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.
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.
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.
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 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.
0 votes
fr.wikipedia.org/wiki/Additive_inverse
3 votes
280Z28 : C'est équivalent à myInt = -1.
1 votes
Doit être monInt |= int.MinValue ;
0 votes
@280Z28 : Cela ne fonctionne que pour les nombres impairs, sinon cela revient à rendre le nombre négatif, puis à soustraire 1.
3 votes
Pour la clarté du code, je ne pense pas que vous devriez utiliser System.Math.Abs() si vous voulez simplement "convertir un nombre négatif en positif". Mathématiquement, ce n'est pas ce qu'est la valeur absolue, même si vous obtenez le résultat souhaité. En fonction de votre contexte algorithmique, vous devriez utiliser la solution acceptée ci-dessous pour passer du négatif au positif également.
0 votes
Charles, si tu ne veux pas tenir compte des nombres négatifs, tu peux annuler le nombre avec
(myInt = ~myInt + 1)
. La façon dont vous l'avez fait est simplement(myInt = myInt - 2147483647 - 1)
pour les nombres positifs (négatifs inchangés), qui est à peu près aussi utile que celui que j'ai mis dans le premier commentaire :) Pour les nombres à virgule flottante, la manipulation des bits comme vous le faites fonctionne.0 votes
@280Z28, Ce que j'ai écrit n'est pas la "négation" du nombre, c'est l'équivalent de moins la valeur absolue du nombre, ce qui est différent. La négation d'un négatif donnerait un positif. J'ai supposé que l'auteur de la question voulait obtenir un négatif à partir de n'importe quel nombre positif ou négatif...
0 votes
"Convertir un nombre positif en négatif" n'est pas la même chose que de demander l'équivalent négatif de
Math.Abs
et la réponse acceptée ne fait pas cela non plus, elle inverse simplement le signe de n'importe quel nombre. Vous devez donc synchroniser 1.Titre, 2.Question et 3.Réponse acceptée.0 votes
Connaissez-vous la puissance du signal négatif ?
0 votes
Je suis étonné de voir autant de réponses à cette petite question, mais choqué de ne trouver aucun disque sur la comparaison des performances de différentes solutions !