Convertir un nombre positif en négatif en C #


142

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?



3
280Z28: Cela équivaut à myInt = -1.
récursif

1
doit être myInt | = int.MinValue;
Charles Bretana

@ 280Z28: Cela ne fonctionne que pour les nombres impairs, sinon c'est la même chose que de rendre le nombre négatif, puis de soustraire 1.
Cecil a un nom

3
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 devez utiliser la solution que vous avez acceptée ci-dessous pour passer également du négatif au positif.
Chris Dwyer

Réponses:


452

Que diriez-vous

myInt = myInt * -1


55
Cette solution est excellente car elle peut également convertir le négatif en positif! Génie!
Will Eddins

19
J'avais l'impression que vous pouviez simplement coller un "-" devant n'importe quoi pour le nier ... -myInt Ce serait le négatif de la valeur dans myInt ... -ABS (myInt) serait un négatif garaunteed.
DataDink

12
et quoi myInt = - Myint?
kokbira

9
ou même plus court myInt *= - 1?
nawfal

Pour info, si vous essayez la méthode de kokbira avec un court-métrage, un myShort = (short) -myShortcast est nécessaire car le court devient un int lorsqu'il est annulé.
AaronLS

236
int myNegInt = System.Math.Abs(myNumber) * (-1);

29
+1 pour se souvenir que si c'était déjà un négatif, vous auriez l'effet inverse. Votre réponse est la seule qui donnerait toujours un nombre négatif, que myNumber soit positif ou négatif.
David

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

6
30 votes positifs? Déjà la question est si simple. Et cette réponse trop compliquée (-System.Math.Abs ​​(myNumber) ferait aussi) obtient 30 votes en plus ????
mmmmmmmm

4
@rstevens tout le monde essayant en collaboration d'indiquer que cette réponse est bien plus correcte que celle acceptée. De plus, - vs * -1 n'est certainement pas "trop ​​compliqué".
Rex M

4
J'aime mieux cette réponse que celle de -System.Math.Abs, car c'est un peu plus évident en un coup d'œil ce qui se passe ... Je pense qu'il serait légèrement plus facile de rater le "-" devant l'énoncé.
Beska

132
int negInt = -System.Math.Abs(myInt)

11
Oui, parce que la négation est le but, donc un moins unaire est le bon opérateur. D'autre part, multiplier par moins un n'est qu'une astuce pour annuler une valeur.
Steven Sudit

38
C'est une astuce car cela compte sur un effet secondaire, pas sur l'effet primaire. Le principal effet du moins unaire est de nier. Le principal effet de la multiplication est de se multiplier. Il se trouve que multiplier par -1 annule. Est-ce plus clair?
Steven Sudit

5
@StevenSudit Non, pas plus beau que * -1. Multiplier par -1 n'est pas "une astuce", c'est la manière mathématique de tourner un nombre négatif. -Number est juste un raccourci de -1 * Number. De plus, utiliser Abs pour garder le nombre négatif est une exagération. myInt<0 ? myInt : -myInt;c'est bien mieux. Ce n'est pas parce que l'opérateur - est fourni comme un raccourci pour le nombre -1 * approprié plus les capacités de surcharge que * (-1) est une astuce.
ThunderGr

93

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;

8
Tout le monde oublie le moins unaire.
récursif

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

@ makerofthings7, celui auquel vous vous êtes lié est beaucoup plus d'instructions CPU - une opération en valeur absolue (au moins trois instructions sur x86), suivie d'un MUL (ou éventuellement d'un NEG si le compilateur est intelligent). Cette réponse est un opcode NEG unique et léger, ni plus ni moins que ce dont vous avez besoin. Bien entendu, les deux réponses se comportent différemment lorsque le nombre d'entrée est déjà négatif; si (contrairement à cette question) votre contribution peut être négative, cela prend la décision à votre place.
Joe White

41

Note à tous ceux qui ont répondu avec

- Math.Abs(myInteger)

ou

0 - Math.Abs(myInteger)

ou

Math.Abs(myInteger) * -1

comme moyen de garder les nombres négatifs négatifs et de transformer les positifs en négatifs.

Cette approche a un seul défaut. Cela ne fonctionne pas pour tous les entiers. La plage de Int32caractères va de "-2 31 " à "2 31 - 1". Cela signifie qu'il y a encore un nombre «négatif». Par conséquent, Math.Abs(int.MinValue)jette un fichier OverflowException.

La bonne façon est d'utiliser des instructions conditionnelles:

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

Cette approche fonctionne pour "tous" les entiers.


Je vais vous jeter le point sur l'exactitude, mais tout code qui dépend de personne ne prenant l'Abs de MinValue est fragile.
Steven Sudit

Steven: Parfois, vous résolvez un problème (comme Abs) qui ne peut pas fonctionner pour int.MinValue(en supposant le inttype de retour.) Dans ce cas, il est tout à fait normal de lancer une exception. Cependant, ce problème spécifique a un résultat «valide» pour int.MinValuemais lève une exception si vous prenez la Absroute.
Mehrdad Afshari

Après avoir dit que l'échelle négative est plus grande que la positive, vous allez alors suggérer un code qui n'en tient pas compte. Si nc'est -32768alors, -nc'est AUSSI -32768!!! De plus, int neg = n < 0 ? n : -n;il ne peut pas fonctionner dans tous les cas, car l'un des ternaires ne fait absolument rien.
Clive Galway

20

Le moyen le plus simple:

myInt *= -1;

1
Était sur le point de poster le même, tout le monde devrait montrer le * = un peu d'amour :-)
Brian Scott

16
int negInt = 0 - myInt;

Ou garanti négatif.

int negInt = -System.Math.Abs(someInt);

11

Pour changer le signe d'un entier, il vous suffit d'utiliser l'opérateur de signe:

myInt = -myInt;

Pour le rendre négatif, que la valeur d'origine soit négative ou non, utilisez d'abord la méthode Abs:

myInt = -Math.Abs(myInt);

6

Juste pour plus de plaisir:

int myInt = Math.Min(hisInt, -hisInt);

int myInt = -(int)Math.Sqrt(Math.Pow(Math.Sin(1), 2) + Math.Pow(Math.Cos(-1), 2))
            * Math.Abs(hisInt);

2
Trop risqué, à mon humble avis. Et si la définition d'un cercle change?
MusiGenesis

6

EDIT: C'est faux pour les entrées positives ... J'ai fait l'erreur d'oublier que le reste des bits en -x (2s-Complement value) sont à l'opposé de leur valeur en + x, pas les mêmes. Donc, changer simplement le bit de signe ne fonctionnera PAS pour les nombres positifs.

Je vais laisser ceci ici pour des raisons ...

Ou la manière délicate (je pense) ...

int y = x | ~ int.MaxValue;

cause int.MaxValue is 0111 1111 1111 1111 1111 1111 1111 1111

alors

~int.MaxValue is      1000 0000 0000 0000 0000 0000 0000 0000

et donc tout int32 Or'ed avec qui mettra un 1 dans le bit de signe, (le rendant négatif), et laissera tous les autres bits identiques ...

EDIT: en fait, puisque le 1000 0000 0000 0000 0000 0000 0000 0000 est en fait la valeur minimale, cela devrait également fonctionner:

   int y = x | int.MinValue; // or, to do it to itself,
   x |= int.MinValue;

Donc, zéro négatif est égal à int.MinValue?
récursif

Non, en complément de deux, il n'y a pas de zéro négatif. tous les uns sont négatifs 1. A 8 bits signés Int: 10000000 est -128
Charles Bretana

1
+1 parce que personne ne mérite d'être critiqué pour avoir répondu à une question comme "quelle lettre vient après A mais avant C?"
MusiGenesis

... et, grâce à la réponse de @ Mehrad ci-dessous, C'est la seule approche qui fonctionne lorsque l'entrée est int.MinValue ...
Charles Bretana

Charles: C'est faux. Pour les nombres négatifs, cela fonctionne mais pour les nombres positifs, il ne suffit pas de retourner le bit de signe -number. 1est tous des zéros et un un. Ou-ing avec int.MinValuele résultat 10000000000000000000000000000001 qui n'est pas égal à -1(tous les.)
Mehrdad Afshari

6

Même si je suis bien en retard à la fête ici, je vais ajouter quelques astuces utiles de mes jours de matériel. Tous ces éléments supposent la représentation complémentaire de 2 pour les nombres signés.

int negate = ~i+1;
int positiveMagnitude = (i ^ (i>>31)) - (i>>31);
int negativeMagnitude = (i>>31) - (i ^ (i>>31));

Voulez-vous expliquer cela davantage? avec i == int.MinValue, alors toutes les variables sont-2147483648
Clive Galway

5

Juste pour le fun:

int negativeInt = int.Parse(String.Format("{0}{1}", 
    "-", positiveInt.ToString()));

Mise à jour : la beauté de cette approche est que vous pouvez facilement la refactoriser en un générateur d'exceptions:

int negativeInt = int.Parse(String.Format("{0}{1}", 
    "thisisthedumbestquestioninstackoverflowhistory", positiveInt.ToString()));

5

j'utilise myInt = -myInt;

Si simple et facile

Si vous ne voulez avoir que du positif

myInt = myInt>0 ? myInt : -myInt;

Je cherchais cette réponse dans une situation légèrement différente de celle du PO. Je veux que 2 valeurs se nient si l'une d'elles est -5 l'autre devrait être 5, c'est donc ma meilleure solution = D
Mathieu Brouwers

vous auriez un débordement puisque le int.MaxValueest 2147483647, même var i = int.MaxValue; i++;ne fonctionnera pas
CMS

4
long negativeNumber = (long)positiveInt - (long)(int.MaxValue + 1);

Personne n'a dit qu'il devait s'agir d' un nombre négatif particulier .


Euh, si vous ne vous souciez pas du fait qu'il doit s'agir d'un nombre négatif particulier , vous pouvez simplifier cela en "long negativeNumber = -1;"
Beska

@Guffa: c'est la blague ici, en fait.
MusiGenesis




0

Conversion d'un nombre de positif en négatif ou de négatif en positif:

public static decimal Reverse(this decimal source)
{
     return source * decimal.MinusOne;
}

0

Juste quelque chose que je veux partager.

public decimal NumberReevaluate(decimal number, bool isPositive)
{
    var tempNumber = System.Math.Abs(number);
    return isPositive ? tempNumber : -tempNumber;
}

1
number >= 0 == isPositive ? number : -number
Vitaliy

0

Comme mentionné précédemment, multiplier simplement par -1 n'est pas cool, car int.MinValue * -1 == int.MinValue

Cela dépend vraiment de votre application, mais pour la mienne (Inverser les axes du joystick), je veux m'assurer que tous les extrêmes sont toujours accessibles et maintenir autant de fidélité que possible.
À cette fin, je mappe Max <--> Min et tout ce qui se trouve entre les deux obtient un. * -1
En utilisant cette technique, -32767 est inaccessible lors de l'inversion.

private static int Invert(int value) { if (value == int.MaxValue) return int.MinValue; if (value == int.MinValue) return int.MaxValue; return value * -1; }


L'inversion en 5n'est pas -5, mais 1/5.
dafie le

-2

Utilisez binaire et pour supprimer le dernier bit responsable du signe négatif.

Ou utilisez binaire ou pour ajouter un signe à un type de données.

Cette solution peut sembler absurde et incomplète, mais je peux garantir que c'est la méthode la plus rapide.

Si vous n'expérimentez pas avec ce que j'ai publié, cet article peut sembler nul: D

Par exemple pour int:

Int est un type de données 32 bits donc le dernier bit (32e) détermine le signe.

Et avec une valeur qui a 0 à la place 32 et reste 1. Il convertira le non négatif en + ve.

Pour juste le contraire ou avec une valeur avec 1 à la 32e place et reste 0.


-3

X=*-1peut ne pas fonctionner sur tous les compilateurs ... car il lit un 'multiplier' 'SUBTRACT' 1 au lieu de NÉGATIF ​​Le meilleur alt est X=(0-X), [WHICH IS DIFF FROM X-=X]

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.