Negative Werte umwandlen ohne Multiplikation

Moderator #4236559
Lesenswert?
• ▲
▼
Der GCC erkennt alle folgenden Ausdrücke als Negation und erzeugt
entsprechend eine einzige Assembler-Instruktion:
1
   -x
2
   x*(-1)
3
   (x ^ 0xff) + 1
4
   (x - 1) ^ 0xff

Die erste Variante erfordert am wenigsten Tipparbeit und verhilft selbst
dem dümmsten Compiler dazu, den erwarteten Code zu erzeugen.

@Bernds: Brauchst du die Fallunterscheidung, oder steht vorab schon
fest, dass die Zahlen negativ sind?
#4236658
Lesenswert?
• ▲
▼
Bernds schrieb:

> gibt es einen Trick, bei einem int8_t Wert das Vorzeichen zu entfernen?

Gegenfrage: wozu braucht man da einen Trick?

> -100 bis -1 sollen in 100 und 1 gewandelt werden

Gegenfrage: was ist verkehrt an
1
if (x<0) 
2
{
3
    x= -x;
4
}

? [1]

Die optimale Umsetzung der arithmetischen Negation hängt natürlich von 
der Zielplattform ab. Andererseits wird jeder auch nur halbwegs 
ausgereifte Compiler dafür eine performante Lösung kennen. Was ist also 
das Problem?

[1] wahhlweise auch als Makro oder C++ Template abs(x) formuliert.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.