Ich möchte die absolute Differenz von zwei ganzen Zahlen berechnen. Naiv betrachtet ist dies einfach abs(a - b)
. Dies ist jedoch mit einigen Problemen verbunden, je nachdem, ob es sich um ganze Zahlen mit oder ohne Vorzeichen handelt:
-
Für ganze Zahlen ohne Vorzeichen,
a - b
eine große positive Zahl sein wird, wennb
größer ist alsa
und die Absolutwert-Operation wird dies nicht beheben. -
Für ganze Zahlen mit Vorzeichen,
a - b
kann außerhalb des Bereichs der Werte liegen, die als vorzeichenbehaftete Ganzzahl dargestellt werden können, was zu undefiniertem Verhalten führt. (Dies bedeutet natürlich, dass das Ergebnis eine ganze Zahl ohne Vorzeichen sein muss.)
Wie können diese Probleme auf effiziente Weise angegangen werden?
Ich möchte einen Algorithmus (oder ein Paar von Algorithmen), der sowohl für vorzeichenbehaftete als auch für vorzeichenlose Ganzzahlen funktioniert und sich nicht auf die Umwandlung der Werte in eine größere Ganzzahlgröße stützt.
(Um das klarzustellen: meine Frage ist nicht, wie man das in Code schreibt, sondern was genau ich schreiben sollte, um Überlaufsicherheit zu garantieren. Berechnung abs(a - b)
als vorzeichenbehafteter Wert und anschließendes Casting auf einen vorzeichenlosen Wert funktioniert nicht, da ein Überlauf einer vorzeichenbehafteten Ganzzahl zumindest in C normalerweise eine undefinierte Operation ist).