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)
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;
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);
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?
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 ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.