gibt es nicht einen operator in c ändern Sie die Zeichen ein int float etc vom negativ zum positiv oder Umgekehrt?
versuchen zu finden, ein absoluter Wert und ich dachte, es war ein einfacher Weg, um einfach nur umkehren die Zeichen mit '~' oder so etwas.
- was ist, wenn Ihr schon negativ? Sie werde kündigen aus?
- Ich weiß nicht, objective-c, sondern auf der Grundlage Ihrer Frage, gibt es wahrscheinlich eine library-Funktion, um den absoluten Wert ... mucking mit dem Schild wäre ein code smell zu mir.
Du musst angemeldet sein, um einen Kommentar abzugeben.
oder
Invertiert das Zeichen, setzen Sie ein Minuszeichen davor.
Einfache negation mit
-
funktioniert, aber die meisten Antworten haben die Tatsache ignoriert, dass das OP versucht zu tun, absoluten Wert. Für dass, das richtige Werkzeug istabs()
für Ganzzahlen undfabs()
für Schwimmer. Der code wird kristallklar sein-und das Ergebnis wird das sein, was Sie erwarten. (Edit: Lesen Sie bitte die Dokumentation und bugs für diese tools. Als Nick weist darauf hin, negiert die negative Zahl mitabs()
wieder die gleichen negativen Zahl).int checked_abs(int)
wenn Sie mögen.Der unäre negationsoperator
-(expr)
genau das tut, was Sie wollen.Das bitweise Komplement-operator
~(expr)
, die Sie erwähnen, auf der anderen Seite, dreht alle bits in der Eingabe.Falls es hilft, ein Thema, das viele absolute Wert Implementierungen in der wildnis zu ignorieren ist, dass die Negation der größten negativen Wert einer festen Größe von zwei der Ergänzung Ganzzahl-überlauf.
-x geben Sie die Vorzeichen-invertierten Wert von x.
Heikles Thema. Der direkte Weg zum ändern der Zeichen auf eine floating-point-Zahl kippen Sie den Wert der Variablen s most significant bit. Die notation aufgeführt, die in den anderen Antworten auf die Gnade des Compilers, die in der Regel in Ordnung, aber nicht immer. Für "float-x", ist die Antwort:
*(unsigned int*)&x ^= (1<<31)
Wenn Sie für das schreiben sind so etwas wie das iPhone, welches einen Cortex-A8-Prozessor (oder etwas ähnliches), Sie wollen vermeiden, dass Doppel-und vermeiden Sie auch den Bedingungen bei der Arbeit mit floats in inneren Schleifen. Damit Sie dies tun können:
*(unsigned int*)&x ^= ( (x<0) << 31 );
Die wiederum negativ zu positiv, ohne mit einem Sprungbefehl. Wenn dies in einer inneren Schleife, es wird 5 bis 20 mal schneller als mit einer anderen Methode, die auf dem iPhone. Wenn es nicht in einer inneren Schleife, dann haben Sie wahrscheinlich don ' T care zu viel!
x = 0 - x;
? oder muss ich den Punkt verpassen?
Das ist eine beschissene Lösung, nicht sicher, was hier passiert ist. Siehe die Antwort unten mit abs() für die richtige.
Obwohl dies ist eine alte Frage, vielleicht ist diese Antwort hilft einigen von Euch. Ich wollte einen positiven oder negativen Wert einer Zahl, basierend auf einem anderen führen (können sagen, eine Boolesche mustBeNegative) die Art, wie ich dies getan habe ist:
Wird die Zahl seiner positiven oder negativen Wert auf der Grundlage des "mustBeNegative" Wert. Wenn die Anzahl war bereits eine negative Zahl wird positiv wird und Umgekehrt.