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?
1 | uint8_t abs_diff(int8_t a, int8_t b) { |
2 | return a>b?a-b:b-a; |
3 | }
|
?
1 | #include <stdlib.h> |
2 | //...
|
3 | int a,b,c |
4 | //...
|
5 | c = abs(a-b); |
6 | //...
|
?
OK Danke soweit nun noch die Frage was passiert, wenn a = -32000 und b = 32000 ist?
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.