Forum: Mikrocontroller und Digitale Elektronik Differenz zweier signed Zahlen bilden


von Harald (Gast)


Lesenswert?

Mahlzeit.
Ich möchte die Differenz zweier signed int bilden und anschließend den 
Betrag. Wie kann ich das mit hinsicht auf die Bereichsgrenzen am besten 
erledigen?

von Εrnst B. (ernst)


Lesenswert?

1
uint8_t abs_diff(int8_t a, int8_t b) {
2
  return a>b?a-b:b-a;
3
}
?

von Michael K. (Gast)


Lesenswert?

signed int

also int16 ....

von Jörg X. (Gast)


Lesenswert?

1
#include <stdlib.h>
2
//...
3
int a,b,c
4
//...
5
c = abs(a-b);
6
//...
?

von Harald (Gast)


Lesenswert?

OK Danke soweit nun noch die Frage was passiert, wenn a = -32000 und b = 
32000 ist?

von Jörg X. (Gast)


Lesenswert?

Mit Standard-libc Mitteln:
1
#include <stdlib.h>
2
//...
3
int a,b
4
unsigned c;
5
//...
6
c = labs((long)a-b);
7
//...
hth. Jörg
PS.: zumindest beim GCC sind "abs" und "labs" builtin-functions, die 
können sehr gut optimiert (ge-inline-t, etc.) werden.

von Peter X. (vielfrass)


Lesenswert?

Jörg X. wrote:
> PS.: zumindest beim GCC sind "abs" und "labs" builtin-functions, die
> können sehr gut optimiert (ge-inline-t, etc.) werden.

Wie geht das nochmal?

von Peter D. (peda)


Lesenswert?

Die Lösung von Ernst Bachmann ist die einzig richtige (int8 durch int16 
ersetzt).

Vorher abziehen ist falsch!

Und erst nach long wandeln erzeugt nur unnötigen Overhead (auf 8- und 
16-bitter).


Peter

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.