Neuen Wert mit alten Wert inkl. Toleranz vergleichen

OT:
ich finde ja auch das Arduino Ergebnis von

int easteregg = abs(−32768);

spannend.

Oder gar abs(-32768)

int easteregg1 = 32.768; // ist ntürlich 32
int easteregg = 32768; // ist hier tatsächlich off topic

OK, was ist spannend?
Ich kann nich ausprobieren (kein Board mit 16bit MCU zur Hand), einfach nachdenken darueber gibt aber Antwort:

  • minus 32768 ist 0x8000, bei 16bit MCU also das volle negativ moegliche (nur sign bit ist gesetzt)
  • aber auf einer 16bit MCU ist das maximal positive: 32767 (0x7FFF)!

Was macht er denn bei Dir daraus? Ich vermute wieder -32768 (was logisch ist).

Bei signed int immer aufpassen, dass negativ noch eins weniger ist, im Verhaeltnis zu positiv (-32768 vs. 32767). Das kommt vom "Two's-Complement": der Null-Punkt liegt nicht wirklich in der Mitte (der negative Bereich hat einen Wert mehr als der positive).

Wenn man versteht, wie die Werte in MCU kodiert werden ("Zweier-Komplement"), dann ist
minus 32768 und ABS davon (mit minus vor dem value) wieder 0x8000, was wieder minus 32768 ergibt.

Alles klar fuer mich, und nichts "ungewoehnliches": den maximalen negativen Wert INT_MIN (auf 16bit Platformen, als 0x8000) - kann man NICHT in positive verwandeln (ebenso nicht 0x80000000 auf 32bit Platformen).

Dafuer gibt es macros, als INT_MAX und INT_MIN:
INT_MAX und INT_MIN
Man sollte also kein INT_MIN value in ABS() schicken (was das eh nicht als INT_MAX dargestellt werden kann, sondern wieder INT_MIN ergibt).

Einfach mal nachvollziehen, was das "Two's Complement" macht und warum es bei INT_MIN wieder INT_MIN wird ("wegen dem negieren und plus 1").
Alles richtig was die SW macht: nur halt beachten das abs(INT_MIN) nicht gehen kann (weil negative und positive Werte nicht "symmetrisch" um 0 herum sind, wegen dem "plus 1" im Zweier-Komplement, oder "minus 1", je nachdem in welche Richtung.
Nichts Spannendes fuer mich.

Zum Rekapitulieren (wiederholen):
Wie wandelt man positive zu negative (oder umgekehrt) Zahl um? Was ist das Zweier-Komplement (Two's Complement)?

Negiere alle bits und addiere 1.
So, aus 0x8000 (als 16bit) wird:
0x7FFF und plus 1 = 0x8000 (wieder negativ, als INT_MIN, nur Vorzeichen ist gesetzt).

Aus +1 (0x0001) wird:
negiert = 0xFFFE plus 1 = 0xFFFF (was jeder als -1 kennt).

"do you remember...?"
So, 0x8000 wird wieder zu 0x8000 (als -32768) mit ABS(). Nichts "ungwoehnliches" zu bestaunen, ausser: INT_MIN "sollte" man nicht in das ABS() stecken (da nicht dargestellt werden kann = "Ueberlauf").

Ich kenne kein Board mit 16 Bit MCU. Ich kenne mit 8 und mit 32 aber nicht mit 16.

Man hat eine negative Zahl mehr, weil es auch eine Zahl für die Null braucht, die dann von den positiven Zahlen "genommen wird".
Zum Veranschaulichen ein Beispiel in Dezimal:
Man hat positive Zahlen 0 bis 9 und die negativen von -1 bis -10. Beides sind 10 Zahlen, also insgesamt 20 Zahlen, eine gerade Zahl wie in Binär mit 16 Bit..

Grüße Uwe

Übrigens (immer noch OT):
Nicht zum Spaß ist (signed) integer overflow undefiniertes Verhalten in C/C++, während für vorzeichenlose Zahlen der "wrap around"
(uint16_t) 65535 + 1 == 0 definiert ist.

Ob Ausprobieren, was bei undefiniertem Verhalten passiert,

  • verboten
  • sinnlos
  • spannend

ist, ist individuell unterschiedlich.