Minus 0
Es gibt zahlreiche Methoden, Zahlen zu speichern. Die grund­legende Art ist die Abbil­dung der ganzen Zahlen (unsig­ned inte­gers) von 0 bis 2−1 als Binär­zahlen in n auf­ein­ander­fol­gen­den Bits. Heute ist es üblich, höher­wer­tige Stellen auch an höher­wer­tigen Bits und unter höhe­ren Adres­sen zu spei­chern, für n eine Zweier­potenz zu wählen und sich an die Wort­grenzen zu hal­ten. Das war nicht immer der Fall, weil man die höher­wer­tigen Adres­sen rechts denkt, die höher­wer­tigen Stellen einer Zahl jedoch links schreibt.

Will man auch negative ganze Zahlen (signed inte­gers) dar­stel­len, so ent­schei­det man sich heut­zutage, die unsig­ned inte­gers u mit füh­ren­der 1 als s=u−2 nega­tiv zu inter­pre­tie­ren. Diese Dar­stel­lung heißt 2er‑Kom­ple­ment, weil das nor­male Addi­tions­ver­fah­ren zu s und −s immer 2, also 0 mit Über­trag ergibt.

Diese Darstellung ist keinesweg mit den Compu­tern erfun­den wor­den. Mecha­nische Rechen­maschi­nen hat­ten die glei­chen Grund­lagen. Nur verwen­dete man die Dezi­mal­dar­stel­lung und damit statt des 2er‑ das 10er‑Kom­ple­ment. Beide leiden unter man­geln­der Symme­trie. So gibt es unter­halb der 0 eine Zahl mehr als ober­halb. Diesen Mangel beseitig man nicht durch Strei­chung der klein­sten Zahl, denn die auf Compu­tern übliche bit­weise Nega­tion stimmt nicht mit der arith­meti­schen über­ein. Leider ist not(s)=−s−1. Auch kann bei nega­tiven Zahlen die häufig vorkom­mende Divi­sion durch eine Zweier­potenz nicht durch eine viel schnel­lere Bit­ver­schie­bung ersetzt werden.

Für binär darge­stellte Zahlen werden die geschil­derten Nach­teile ver­mieden, indem man zum Wechsel des Vor­zei­chens einfach alle Bits umkehrt und die unsig­ned inte­gers u mit füh­ren­der 1 als nega­tive Zah­len s=u−2+1 inter­pre­tiert. Diese Methode heißt 1er‑Kom­ple­ment, weil die Addition von s und −s auf eine Kette aus lauter Ein­sen führt. Für Dezimal­zahlen ist es das 9er‑Kom­ple­ment. Die so gewon­nene Symme­trie ergibt ele­ganter­weise not(s)=−s, und auch nega­tive Zahlen können durch einfach Bit­verschie­bung durch eine Zweier­potenz geteilt werden.

Doch leider liefert das normale Additions­verfah­ren nicht immer das rich­tige Ergeb­nis. Das Carry‑Bit ist zusätz­lich zu addieren, wodurch diese Zahl­darstel­lung nur auf Compu­tern Sinn macht, die diesen Zusatz (end-​arround carry) in der Hard­ware reali­siert haben. Außer­dem liefert eine Addi­tion zur 0 lauter 1‑Bits, die soge­nannte nega­tive Null, während die posi­tive Null aus lauter 0‑Bits besteht. [1]

Man könnte eine der beiden ver­bieten, also durch die andere erset­zen. Schöner aber ist es, beide Nullen zu benut­zen. Das gestat­tet elegante Pro­gramme, birgt aber auch Gefahren. So werden −0 und +0 im nor­malen Bit­ver­gleich als ver­schie­den getestet. Damit der unbedarfte Programmierer möglichst nie auf die  0 trifft, führt die Hard­ware Addi­tionen als Subtrak­tionen (sub­trac­tive adder) aus.

Auch hier ist eine Un­symme­trie nicht weg­zudis­kutie­ren, die zu der Ein­sicht ver­hel­fen sollte, daß es nicht immer mög­lich ist, etwas symme­trisch, eben­mäßig oder einfach darzu­stellen, was ungleich, hol­prig oder schwie­rig ist. Eine zunächst vor­handene Unsym­me­trie (2er‑Kom­ple­ment) weit­gehend zu besei­tigen und auf ein möglichst unbe­merkt blei­ben­des Detail (+0 und −0) zu ver­schie­ben, ist eigent­lich Augen­wische­rei. Ich halte das dua­listi­sche Bestre­ben, alles auf zwei kom­plemen­täre Teile zurück­zufüh­ren, für naiv und gefähr­lich. Man kann nicht 0 und 1, und und oder, posi­tiv und nega­tiv, links und rechts, wahr und falsch auf allen Ebenen vertau­schen und erhält wieder das glei­che.

[1] Minus Zero. Fourmilab Switzerland. Beschrei­bung der Univac-​1100-​Serie, 36‑Bit-​Rechner der Sieb­ziger mit einer Wort­breite abseits heute übli­cher Zweier­poten­zen. In einem Wort konn­ten Zahlen von ±0 bis ±2³⁵−1 gespei­chert werden, insbe­sondere zwei Nullen −0 und +0.

28 | Jahr 0 | 00 | noon

... comment