Forum: Mikrocontroller und Digitale Elektronik Negative Werte umwandlen ohne Multiplikation


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Bernds (Gast)


Lesenswert?

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

-100 bis -1
sollen in 100 und 1 gewandelt werden, also lediglich das Vorzeichen soll 
verschwinden.

So würde es gehen Wert * (-1)
von Rene H. (Gast)


Lesenswert?

X = abs(wert)
von mh (Gast)


Lesenswert?

Negative Zahlen werden als 2er-Komplement dargestellt --> 
https://de.wikipedia.org/wiki/Zweierkomplement

gebildet wird's quasi so:
negInt8 = (posInt8 ^ 0xFF) + 1;

Alsu zum "wegmachen":
posInt8 = (negInt8 - 1) ^ 0xFF;
von Andreas M. (amesser)


Lesenswert?

Ist das Ernst gemeint?
1
if (i<0)
2
{
3
i=-i;
4
}
von Oldi (Gast)


Lesenswert?

Blöd wird's, wenn -128 vorliegt.

Am besten quetscht man die Ausnahme in den erlaubten
Bereich:
i = (i == -128) ? 127 : ((i < 0) ? -i : i);
von Yalu X. (yalu) (Moderator)


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?
von Werner M. (Gast)


Lesenswert?

Oldi schrieb:
> Blöd wird's, wenn -128 vorliegt.

Vorzeichen entfernen bedeutet doch wohl uint8_t als Zieltyp. Dann sind 
+128 doch überhaupt kein Problem ;-)
von Axel S. (a-za-z0-9)


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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.