201b
<< <> >>
 
Leo: Wenn man zwei verschiedene Zahlen voneinander abzieht, würde ich sagen, kann das nicht Null ergeben. Muss ich zum Erlernen von Forth auch noch mein Allgemeinwissen über das Rechnen mit Zahlen revidieren? Das wäre zuviel verlangt.
Theo: Da steckt Folgendes dahinter:
Dieses Forth arbeitet mit Zahlen von -32768 bis einschließlich 32767. Das kommt daher, weil es Zahlen in ein Muster von 16 Bits packt. Zahlen, die größer oder kleiner sind, passen nicht mehr in diese 16 Bits, denn mit 16 Bits kannst du höchstens 65536 (= 2 hoch 16) verschiedene Bitmuster erzeugen.
Leo: Aber warum schluckt dann dieses Forth die 40000 trotzdem?
Theo: Da hast du Recht, in einer anderen Programmiersprache würde hier wahrscheinlich eine Fehlermeldung kommen. Es hat aber wiederum Sinn, dass das Forth-System die 40000 gutheißt. Ich werde dir erklären, warum.

Du kannst den gesamten Zahlenbereich von -32768 über 0 nach 32767 durchlaufen, indem du fortwährend 1 hinzuaddierst. Am Rande des Bereichs geschieht Folgendes:
32767 1 + . [rtn]  -32768 ok
Wenn du die größte Zahl um 1 erhöhst, kommt als Ergebnis die kleinste Zahl zum Vorschein! Es tritt ein Überlauf auf, d.h., es entsteht ein Bitmuster von 17 Bits, doch Forth lässt die 17. Stelle normalerweise weg, wodurch die Bitmusterreihe wieder von vorn beginnt und die Zahlengesamtheit tatsächlich auf einem Kreis angeordnet erscheint. Die Folge: Wenn man zwei Zahlen miteinander addiert, erhält man auf jeden Fall ein Ergebnis. Der Programmierer muss selbst im Auge behalten, ob das erhaltene Ergebnis richtig ist, anders gesagt, ob es ohne Überlauf zustande gekommen ist.

Neben diesem System (den SIGNED-Zahlen) gibt es noch ein zweites System (die UNSIGNED-Zahlen), das mit genau denselben Bitmustern arbeitet. Die positiven Zahlen bleiben dabei dasselbe, aber alle negativen Zahlen werden über Bord geworfen und am oberen Ende als höhere positive Zahlen wieder angefügt. Die UNSIGNED-Zahlen laufen von 0 nach 65535. Diese höheren positiven Zahlen müssen auch eingegeben werden können und darum wurde 40000 also akzeptiert. Forth merkt sich lediglich die Zahl als Bitmuster, und nicht die Art und Weise, wie die Zahl eingegeben wurde.

An den Bereichsrändern tritt wieder der Überlauf-Effekt auf.
65535 1 + . [rtn]  0 ok
Aber nun zurück:
0 1 - . [rtn]  -1 ok
Das geht schief, denn der PUNKT weiß nicht, dass es hier um eine UNSIGNED-Zahl geht.
65535 1 + U. [rtn]  0 ok
0 1 - U. [rtn]  65535 ok
+ und - arbeiten in beiden Systemen gut. Für Ausgabezwecke, aber auch für Vergleiche, benötigt man Extra-Befehle: . U. < U< > U>
Und die Lösung deines MAX-Problems liegt also in der Definition eines UMAX, das U< enthält.
>>