2010-01-08 13 views
7

versuchen, den absoluten Wert zu finden, und ich dachte, es gab eine einfache Möglichkeit, das Zeichen einfach mit '~' oder etwas zu invertieren.gibt es keinen Operator in c, um das Vorzeichen eines int float usw. von negativ zu positiv oder umgekehrt zu ändern?

+0

Was ist, wenn es bereits negativ ist? sie werden annullieren? – nickthedude

+0

Ich weiß nicht objective-c, aber basierend auf Ihrer Frage, gibt es wahrscheinlich eine Bibliotheksfunktion, um den absoluten Wert zu bekommen ... Mist mit dem Zeichen wäre ein Code-Geruch für mich. – overslacked

Antwort

20
float newValue = oldValue * -1; 

oder

float newValue = -(oldValue); //() aren't needed, I just use them out of habit 
10

Um das Zeichen umzukehren, setzen Sie ein Minus davor.

+0

Würde der downvoter bitte einen Kommentar hinterlassen. Vielen Dank. –

+0

2 downvotes für keinen Grund? Komm schon! –

+0

Der Titel fragt nach Negation in C, der Inhalt der Frage fragt nach dem absoluten Wert, und irgendwo anders hat das Plakat Ziel C anstelle von C gesagt. Sie können nicht erwarten, dass Ihre Antwort alle zufrieden stellt. Oder irgendjemand. Oder sogar das Originalplakat. Du hättest dich davon fernhalten sollen wie ich. –

4

-x wird Ihnen das Vorzeichen-invertierten Wert von x.

1

x = 0 - x;

? oder vermisse ich den Punkt?

8

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

int x = -7; 
int y = 7; 
x = -x; // x is now 7 
y = -y; // y is now -7 

Die bitweise Komplement-Operator ~(expr), die Sie erwähnen, auf der anderen Seite, dreht alle Bits im Eingang. Wenn es hilft, wird ein Problem, das viele Absolutwert-Implementierungen im Wild ignoriert, darin bestehen, dass das Negieren des negativsten Wertes eines gegebenen Zweierkomplement-Integer-Typs mit fester Größe überläuft.

+0

nette Antwort ... –

+0

Ich habe gerade gesehen, dass dies mit dem Ziel-c markiert ist. Ich hatte ursprünglich bezüglich des Titels geantwortet und nach einem Operator "in C" gefragt. Glücklicherweise "ist Objective-C eine dünne Schicht über C und darüber hinaus eine strenge Obermenge von C. Es ist möglich, jedes C-Programm mit einem Objective-C-Compiler zu kompilieren und C-Code innerhalb eines Objective-C frei aufzunehmen Klasse." http://en.wikipedia.org/wiki/Objective-C –

12

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

+0

Im Prinzip stimme ich zu und ich habe Ihre Antwort gewählt. Natürlich könnte man vernünftigerweise erwarten, dass das Programm beendet wird oder eine Ausnahme ausgelöst wird, wenn versucht wird, die negativste ganze Zahl zu negieren. Siehe BUGS in der verknüpften Dokumentation für abs(). –

+0

@Nick: 'abs()' falle nicht auf dem iPhone; es wird nur INT_MIN zurückgeben. –

+0

@Nick: Das ist nicht im C-Geist. Wie Stroustrup in einem ähnlichen Fall für C++ sagte, sollte die Sprache den schnellen Operator und möglicherweise den überprüften Operator bereitstellen. Wenn die Sprache den schnellen Operator bereitstellt, kann der Benutzer Prüfungen nach Bedarf einfügen, während, wenn die Sprache nur den überprüften Operator bereitstellt, der Benutzer keine Möglichkeit hat, die Überprüfungen zu verwerfen, wenn dies unnötig und schnell ist. Sie können 'int checked_abs (int)' immer schreiben, wenn Sie möchten. –

3

Tricky 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 so etwas wie das iPhone schreiben, die einen Cortex A8-Prozessor (oder so ähnlich) hat, Sie wollen verdoppelt vermeiden und auch vermeiden Bedingungen beim Arbeiten mit Schwimmern in inneren Schleifen. So können Sie dies tun:

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

Welche Negative Positive ohne Verwendung eines Verzweigungsbefehl wenden. 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!

-1

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

Obwohl dies eine alte Frage ist, wird diese Antwort vielleicht einigen von euch helfen.I einen positiven oder negativen Wert einer Zahl auf einem anderen Ergebnis (sagen wir mal einen boolean mustBeNegative), um die Art, wie ich tat dies auf Basis haben wollte:

int number = 7; 
if(mustBeNegative) 
{ 
     number = number * 1; 
} 
else 
{ 
     number = number * -1; 
} 

Die Zahl wird seine positiven oder negativen Wert basiert auf dem " mustBeNegative "Wert. Wenn die Nummer bereits eine negative Nummer war, wird sie positiv und umgekehrt.

+0

Dies ist übermäßig komplex und gleichzeitig falsch. – fishinear

+0

Ja, nicht sicher, was dort passiert ist. Wenn jemand fragt, woran schämen Sie sich am meisten im Internet? Ich werde von nun an auf diese Antwort hinweisen. – Matthijn

Verwandte Themen