Wunderbare C-Welt: Zahlenspielereien
Laut C ist abs(-2147483648) == -2147483648
.
Eigentlich ist abs ja so definiert:
Für x<0: abs(x)=-x, für x>=0: abs(x)=x.
Aber da macht der 32bit-Zahlenraum nicht mit: Bei Zahlen mit Vorzeichen wird 1 Bit für das Vorzeichen benötigt, bleiben 31 Bit für die Zahl selbst. Mit 31 Bit lassen sich 2147483648 Werte darstellen. Also [0, 2147483647] im positiven Bereich. Da keine “-0” benötigt wird, wird in der (üblichen) 2er-Komplement Darstellung für die negativen Zahlen [-2147483648,-1] bereitgestellt (die interne Darstellung ist dabei auch so gewählt, dass sich gut damit rechnen lässt).
Und damit wird klar, warum -2147483648 ein Problem für die abs()-Funktion in C darstellt: es gibt kein -(-2147483648).