/ fun

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).

Patrick Georgi

Patrick Georgi

Von der Stadt aufs Land. Freund des retro computings und des inneren Exils. Die Gedanken sind frei. Dieses Recht findet seine Schranken in den Vorschriften der allgemeinen Gesetze.

Read More