gibt es keinen Operator in c, um das Vorzeichen eines int float usw. von negativ zu positiv oder umgekehrt zu ändern?

8

versuche einen absoluten Wert zu finden und ich dachte, es gäbe einen einfachen Weg, um das Zeichen einfach mit '~' oder etwas zu invertieren.

    
nickthedude 08.01.2010, 05:51
quelle

8 Antworten

20
%Vor%

oder

%Vor%     
Beep beep 08.01.2010, 05:53
quelle
12

Einfache Negation mit - funktioniert, aber die meisten Antworten haben die Tatsache ignoriert, dass das OP versucht, absoluten Wert zu erzielen. Das richtige Werkzeug dafür ist abs() für Ganzzahlen und fabs() für Floats. Der Code wird kristallklar sein und das Ergebnis wird sein, was Sie erwarten. (Bearbeiten: Lesen Sie die Dokumentation und Fehler für diese Tools. Wie Nick darauf hinweist, gibt die Negierung der negativsten Zahl mit abs() die gleiche negative Zahl zurück.)

    
Quinn Taylor 08.01.2010 06:19
quelle
10

Um das Zeichen umzukehren, setzen Sie ein Minus davor.

    
Mitch Wheat 08.01.2010 05:53
quelle
8

Der unäre Negationsoperator -(expr) macht genau das, was Sie wollen.

%Vor%

Der bitweise Komplementoperator ~(expr) , den Sie erwähnen, dreht andererseits alle Bits in der Eingabe.

Falls es hilft, ein Problem, dass viele absolute Wert-Implementierungen in der Wildnis ignorieren, ist, dass das Negieren des negativsten Wertes eines gegebenen Zweierkomplement-Integer-Typs mit fester Größe überläuft.

    
Nick Guerrera 08.01.2010 06:01
quelle
4

-x gibt Ihnen den vorzeicheninvertierten Wert von x.

    
Ignacio Vazquez-Abrams 08.01.2010 05:53
quelle
3

Schwieriges Thema. Der direkte Weg, das Vorzeichen einer Gleitkommazahl zu ändern, besteht darin, den Wert des höchstwertigen Bits der Variablen umzukehren. Die in den anderen Antworten aufgeführte Notation ist dem Compiler ausgeliefert, was normalerweise gut ist, aber nicht immer. Für "float x" lautet die Antwort:

*(unsigned int*)&x ^= (1<<31)

Wenn Sie für etwas wie das iPhone schreiben, das einen Cortex A8-Prozessor (oder etwas ähnliches) hat, möchten Sie Doppelungen vermeiden und auch Konditionale vermeiden, wenn Sie mit Schwimmern in inneren Schleifen arbeiten. So können Sie das tun:

*(unsigned int*)&x ^= ( (x<0) << 31 );

Mit dieser Option werden Negative ohne Verwendung eines Verzweigungsbefehls in positive Werte umgewandelt. Wenn dies in einer inneren Schleife ist, ist es 5 bis 20 mal schneller als eine andere Methode auf dem iPhone. Wenn es nicht in einer inneren Schleife ist, interessiert Sie wahrscheinlich nicht zu viel!

    
JPN 04.10.2010 21:43
quelle
1

x = 0 - x;

? oder vermisse ich den Punkt?

    
Mawg 08.01.2010 05:53
quelle
-1

Das ist eine beschissene Lösung, nicht sicher, was hier passiert ist. Siehe die Antwort unten mit abs () für den richtigen.

Obwohl dies eine alte Frage ist, wird diese Antwort vielleicht einigen von euch helfen. Ich wollte einen positiven oder negativen Wert einer Zahl haben, die auf einem anderen Ergebnis basiert (sagen wir ein boolesches mustBeNegative), wie ich das gemacht habe:

%Vor%

Die Zahl ist ihr positiver oder negativer Wert basierend auf dem Wert "mustBeNegative". Wenn die Nummer bereits eine negative Zahl war, wird sie positiv und umgekehrt.

    
Matthijn 20.10.2013 14:51
quelle