Forum: Mikrocontroller und Digitale Elektronik Negative Werte umwandlen ohne Multiplikation


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.