Konvertieren Sie eine positive Zahl in eine negative in C #


142

Sie können eine negative Zahl wie folgt in eine positive umwandeln:

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

Gibt es eine äquivalente Methode, um eine positive Zahl negativ zu machen?



3
280Z28: Das entspricht myInt = -1.
rekursiv

1
muss myInt sein | = int.MinValue;
Charles Bretana

@ 280Z28: Das funktioniert nur für ungerade Zahlen, ansonsten ist es dasselbe wie die Zahl negativ zu machen und dann 1 zu subtrahieren.
Cecil hat einen Namen

3
Aus Gründen der Codeklarheit sollten Sie System.Math.Abs ​​() nicht verwenden, wenn Sie nur "eine negative Zahl in eine positive umwandeln" möchten. Mathematisch gesehen ist das nicht der absolute Wert, obwohl Sie das gewünschte Ergebnis erhalten. Abhängig von Ihrem algorithmischen Kontext sollten Sie die unten akzeptierte Lösung verwenden, um auch von negativ zu positiv zu wechseln.
Chris Dwyer

Antworten:


452

Wie wäre es mit

myInt = myInt * -1


55
Diese Lösung ist großartig, weil sie auch negativ in positiv umwandeln kann! Genius!
Will Eddins

19
Ich hatte den Eindruck, man könnte einfach ein "-" vor irgendetwas setzen, um es zu negieren ... -myInt Dies wäre das Negative des Wertes in myInt ... -ABS (myInt) wäre ein garaunteed Negativ.
DataDink

12
was ist mit myInt = - Myint?
Kokbira

9
oder noch kürzer myInt *= - 1?
Nawfal

Zu Ihrer Information: Wenn Sie die Methode von Kokbira mit einem Short ausprobieren, ist ein myShort = (short) -myShortCast erforderlich, da der Short beim Negieren zu einem Int wird.
AaronLS

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

29
+1 für das Erinnern daran, dass wenn es bereits negativ ist, Sie den gegenteiligen Effekt haben würden. Ihre Antwort ist die einzige, die immer eine negative Zahl ergibt, unabhängig davon, ob die myNumber positiv oder negativ ist.
David

Nur 26 Stimmen für diese Antwort? Gibt es SO-Benutzer, die glauben, dass dies nicht funktionieren würde?
MusiGenesis

6
30 Stimmen? Schon ist die Frage so einfach. Und diese überkomplizierte Antwort (-System.Math.Abs ​​(myNumber) würde auch reichen) erhält 30 Stimmen ????
mmmmmmmm

4
@rstevens Jeder, der gemeinsam versucht, diese Antwort anzuzeigen, ist weitaus korrekter als die akzeptierte. Auch - vs * -1 ist definitiv nicht "überkompliziert".
Rex M

4
Ich mag diese Antwort besser als das -System.Math.Abs, da es auf einen Blick etwas offensichtlicher ist, was passiert ... Ich denke, es wäre etwas einfacher, das "-" vor der Aussage zu übersehen.
Beska

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

11
Ja, weil Negation das Ziel ist, ist ein unäres Minus der richtige Operator. Andererseits ist das Multiplizieren mit einem negativen Wert nur ein Trick, um einen Wert zu negieren.
Steven Sudit

38
Es ist ein Trick, weil es auf einen Nebeneffekt ankommt, nicht auf den primären Effekt. Der primäre Effekt von unärem Minus ist das Negieren. Der primäre Effekt der Multiplikation ist die Multiplikation. Es kommt einfach so vor, dass das Multiplizieren mit -1 negiert. Ist das klarer?
Steven Sudit

5
@StevenSudit Nein, nicht schöner als * -1. Das Multiplizieren mit -1 ist kein "Trick", sondern der mathematische Weg, eine Zahl negativ zu machen. -Number ist nur eine Abkürzung von -1 * Number. Darüber hinaus ist die Verwendung von Abs, um die Zahl negativ zu halten, ein Overkill. myInt<0 ? myInt : -myInt;ist viel besser. Nur weil der Operator - als Abkürzung für die richtige -1 * -Zahl plus die Überladungsfunktionen angegeben wird, ist * (-1) kein Trick.
ThunderGr

93

Genauso wie Sie alles andere negativ machen: Stellen Sie ein negatives Vorzeichen davor.

var positive = 6;
var negative = -positive;

8
Jeder vergisst das unäre Minus.
rekursiv

Was ist der praktische Unterschied zwischen dieser und dieser Antwort: stackoverflow.com/questions/1348080/… int myNegInt = System.Math.Abs(myNumber) * (-1);
goodguys_activate

@ makerofthings7, mit dem Sie verknüpft sind, sind viel mehr CPU-Anweisungen - eine Absolutwertoperation (mindestens drei Anweisungen auf x86), gefolgt von einem MUL (oder möglicherweise einem NEG, wenn der Compiler clever ist). Diese Antwort ist ein einzelner, leichter NEG-Opcode, nicht mehr oder weniger als das, was Sie brauchen. Natürlich verhalten sich die beiden Antworten unterschiedlich, wenn die eingegebene Nummer bereits negativ ist. Wenn (im Gegensatz zu dieser Frage) Ihre Eingabe negativ sein könnte, trifft dies die Entscheidung für Sie.
Joe White

41

Hinweis an alle, die mit geantwortet haben

- Math.Abs(myInteger)

oder

0 - Math.Abs(myInteger)

oder

Math.Abs(myInteger) * -1

um negative Zahlen negativ zu halten und positive negativ zu machen.

Dieser Ansatz hat einen einzigen Fehler. Es funktioniert nicht für alle ganzen Zahlen. Der Typbereich reicht Int32von "-2 31 " bis "2 31 - 1". Es bedeutet, dass es noch eine "negative" Zahl gibt. Folglich Math.Abs(int.MinValue)wirft ein OverflowException.

Der richtige Weg ist, bedingte Anweisungen zu verwenden:

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

Dieser Ansatz funktioniert für "alle" Ganzzahlen.


Ich werde Ihnen den Punkt für die Richtigkeit vorwerfen, aber jeder Code, der davon abhängt, dass niemand die Abs von MinValue nimmt, ist spröde.
Steven Sudit

Steven: Manchmal lösen Sie ein Problem (wie Abs), das möglicherweise nicht funktioniert int.MinValue(unter der Annahme eines intRückgabetyps). In diesem Fall ist es völlig in Ordnung, eine Ausnahme auszulösen. Dieses spezielle Problem hat jedoch ein "gültiges" Ergebnis für int.MinValue, löst jedoch eine Ausnahme aus, wenn Sie die AbsRoute wählen.
Mehrdad Afshari

Nachdem Sie gesagt haben, dass die negative Skala größer als die positive ist, schlagen Sie Code vor, der dies nicht berücksichtigt. Wenn nist -32768dann -nist auch -32768!!! Darüber hinaus int neg = n < 0 ? n : -n;kann unmöglich in allen Fällen arbeiten, da einer der Ternären absolut nichts tut.
Clive Galway

20

Der einfache Weg:

myInt *= -1;

1
Wollte gleich posten, sollte jeder die * = etwas Liebe zeigen :-)
Brian Scott

16
int negInt = 0 - myInt;

Oder garantiert negativ.

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

11

Um das Vorzeichen einer Ganzzahl zu wechseln, verwenden Sie einfach den Vorzeichenoperator:

myInt = -myInt;

Um es negativ zu machen, unabhängig davon, ob der ursprüngliche Wert negativ ist oder nicht, verwenden Sie zuerst die Abs-Methode:

myInt = -Math.Abs(myInt);

6

Nur für mehr Spaß:

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
Zu riskant, IMHO. Was ist, wenn sich die Definition eines Kreises ändert?
MusiGenesis

6

EDIT: Dies ist falsch für positive Eingaben ... Ich habe fälschlicherweise vergessen, dass die restlichen Bits in -x (2s-Complement-Wert) das "Gegenteil" ihres Wertes in + x sind, nicht dasselbe. Das einfache Ändern des Vorzeichenbits funktioniert also NICHT für positive Zahlen.

Ich werde dies hier für Zwecke lassen ...

Oder der knifflige Weg (glaube ich) ...

int y = x | ~ int.MaxValue;

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

so

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

und deshalb setzt jedes int32 Or'ed damit eine 1 in das Vorzeichenbit (was es negativ macht) und lässt alle anderen Bits gleich ...

EDIT: eigentlich, da der 1000 0000 0000 0000 0000 0000 0000 0000 tatsächlich der Minvalue ist, sollte dies auch funktionieren:

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

Negative Null ist also gleich int.MinValue?
rekursiv

Nein, im Zweierkomplement gibt es keine negative Null. Alle sind negativ 1. A Signed 8Bit Int: 10000000 ist -128
Charles Bretana

1
+1, weil niemand es verdient, für die Beantwortung einer Frage wie "Welcher Buchstabe kommt nach A, aber vor C?"
MusiGenesis

... und dank der Antwort von @ Mehrad unten ist dies der einzige Ansatz, der funktioniert, wenn die Eingabe int.MinValue ist ...
Charles Bretana

Charles: Das ist falsch. Bei negativen Zahlen funktioniert es, bei positiven Zahlen reicht es jedoch nicht, nur das Vorzeichenbit umzudrehen -number. 1ist alles Nullen und eine Eins. Wenn Sie es mit bestellen, erhalten Sie int.MinValue1000000000000000000000000000000001, was nicht -1(allen) entspricht.
Mehrdad Afshari

6

Obwohl ich hier viel zu spät zur Party komme, werde ich mich mit einigen nützlichen Tricks aus meiner Hardware-Zeit einmischen. Alle diese setzen die Komplimentdarstellung von 2 für signierte Nummern voraus.

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

Möchtest du das mehr erklären? mit i == int.MinValue, dann sind alle Variablen-2147483648
Clive Galway

5

Nur zum Spaß:

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

Update : Das Schöne an diesem Ansatz ist, dass Sie ihn einfach in einen Ausnahmegenerator umgestalten können:

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

5

ich benutze myInt = -myInt;

So einfach und leicht

Wenn Sie nur positiv haben wollen

myInt = myInt>0 ? myInt : -myInt;

Ich habe nach dieser Antwort in einer etwas anderen Situation als dem OP gesucht. Ich möchte, dass 2 Werte sich gegenseitig negieren, wenn einer von ihnen -5 ist, der andere sollte 5 sein, daher ist dies meine beste Lösung = D
Mathieu Brouwers

Sie würden einen Überlauf bekommen, da das int.MaxValueist 2147483647, sogar var i = int.MaxValue; i++;nicht funktionieren wird
CMS

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

Niemand sagte, es müsse eine bestimmte negative Zahl sein.


Wenn es Ihnen egal ist, dass es sich um eine bestimmte negative Zahl handeln muss, können Sie dies zu "long negativeNumber = -1;" vereinfachen.
Beska

@ Guffa: das ist eigentlich der Witz hier.
MusiGenesis




0

Konvertieren einer Zahl von positiv in negativ oder von negativ in positiv:

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

0

Nur etwas, das ich teilen möchte.

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

Wie bereits erwähnt, ist es nicht cool, nur mit -1 zu multiplizieren int.MinValue * -1 == int.MinValue

Es hängt wirklich von Ihrer Anwendung ab, aber für meine (Invertierende Joystick-Achsen) möchte ich sicherstellen, dass alle Extreme noch erreichbar sind und so genau wie möglich bleiben.
Zu diesem Zweck * -1
ordne ich Max <--> Min zu und alles dazwischen erhält ein. Mit dieser Technik ist -32767 beim Invertieren nicht erreichbar.

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


Umkehrung zu 5ist nicht -5, aber 1/5.
Dafie

-2

Verwenden Sie binär und, um das letzte Bit zu entfernen, das für das negative Vorzeichen verantwortlich ist.

Oder verwenden Sie binär oder um einem Datentyp ein Vorzeichen hinzuzufügen.

Diese Lösung mag absurd und unvollständig klingen, aber ich kann garantieren, dass dies die schnellste Methode ist.

Wenn Sie nicht mit dem experimentieren, was ich gepostet habe, sieht dieser Beitrag möglicherweise beschissen aus: D.

ZB für int:

Int ist ein 32-Bit-Datentyp, daher bestimmt das letzte Bit (32.) das Vorzeichen.

Und mit einem Wert, der 0 an der Stelle 32 und Rest 1 hat. Er wandelt das negative Nein in + ve um.

Für genau das Gegenteil oder mit einem Wert mit 1 auf Platz 32 und Rest 0.


-3

X=*-1funktioniert möglicherweise nicht auf allen Compilern ... da es ein 'multiplizieren' 'SUBTRACT' 1 anstelle von NEGATIVE liest. Das bessere alt ist X=(0-X), [WAS IST DIFF VON X-=X]

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.