Eine Überlaufbedingung liegt dann vor, wenn nach der Dezimalpunktausrichtung die Anzahl der ganzzahligen Stellen im errechneten Resultat größer ist als die dafür vorgesehene Stellenanzahl.
Syntaxregeln
Die Verletzung der Regeln für die Berechnung von Expontialausdrücken führt immer zum Abbruch der arithmetischen Operation und zum Auftreten einer Überlaufbedingung (siehe „Arithmetische Anweisungen", Allgemeine Regel 4).
Die Angabe ON SIZE ERROR spezifiert eine unbedingte Anweisung, die angibt, welche Aktionen im Falle eines Überlaufs auszuführen sind.
Die Überlaufbedingung bezieht sich nur auf das Endresultat einer arithmetischen Operation; sie bezieht sich nicht auf Zwischenergebnisse, außer in der MULTIPLY- und DIVIDE-Anweisung.
Ist ROUNDED angegeben, so findet das Runden vor der Prüfung auf Überlauf statt.
Ist ON SIZE ERROR angegeben, und eine Überlaufbedingung tritt nach der Ausführung der arithmetischen Anweisung auf, bleiben die Werte der Ergebnisbezeichner dieselben wie vor der Ausführung der Anweisung. Die Werte der Ergebnisbezeichner, für die keine Überlaufbedingung auftritt, bleiben unberührt von einem Überlauf, der für andere Ergebnisbezeichner während einer Operation auftritt. Nach Beendigung der arithmetischen Operationen geht die Ablaufsteuerung über zur in der ON SIZE ERROR-Angabe angegebenen unbedingten Anweisung. Die Ausführung wird gemäß den Regeln für diese Anweisung fortgesetzt. Wird dabei ein Prozedursprung oder eine Bedingungsanweisung ausgeführt, die explizit den Übergang der Ablaufsteuerung bewirkt, erfolgt dieser Übergang; im anderen Fall geht die Ablaufsteuerung nach Beendigung der Ausführung von unbedingte-anweisung der ON SIZE ERROR-Angabe zum Ende der arithmetischen Anweisung über, und die ON SIZE ERROR-Angabe wird, falls angegeben, ignoriert.
Ist ON SIZE ERROR nicht angegeben und es tritt eine Überlaufbedingung auf, sind die Werte der betroffenen Ergebnisbezeichner unbestimmt. Die Werte der Ergebnisbezeichner, für die keine Überlaufbedingung auftritt, bleiben unberührt von einem Überlauf, der für andere Ergebnisbezeichner während einer Operation auftritt. Nach Beendigung der Operationen geht die Ablaufsteuerung zum Ende der arithmetischen Anweisung über, und die NOT ON SIZE ERROR-Angabe wird, falls vorhanden, ignoriert.
Tritt keine Überlaufbedingung auf, geht die Ablaufsteuerung zum Ende der arithmetischen Anweisung oder, falls angegeben, zu unbedingte-anweisung der NOT ON SIZE ERROR-Angabe über. Im letzteren Fall wird die Ausführung gemäß den Regeln für die angegebene(n) unbedingte(n) Anweisung(en) fortgesetzt. Wird dabei ein Prozedursprung oder eine Bedingungsanweisung ausgeführt, die einen expliziten Übergang der Ablaufsteuerung bewirkt, erfolgt dieser Übergang; im anderen Fall geht nach Beendigung der Ausführung von unbedingte-anweisung der NOT ON SIZE ERROR-Angabe die Ablaufsteuerung zum Ende der arithmetischen Anweisung über.
Wenn für eine ADD-Anweisung mit der CORRESPONDING-Angabe oder für eine SUBTRACT-Anweisung mit der CORRESPONDING-Angabe ein Überlauf in einer der Teiloperationen auftritt, wird die unbedingte Anweisung in der ON SIZE ERROR-Angabe erst ausgeführt, wenn alle einzelnen Additionen oder Subtraktionen beendet sind.
Division durch Null bewirkt immer eine Überlaufbedingung.
Für Datenfelder, die mit COMPUTATIONAL-1 oder COMPUTATIONAL-2 erklärt sind, wird bei der Division durch Null die Ausführung der unbedingten Anweisung in der ON SIZE ERROR-Angabe bewirkt.
Beispiel 8-19
IDENTIFICATION DIVISION. PROGRAM-ID. SE. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. TERMINAL IS T. DATA DIVISION. WORKING-STORAGE SECTION. 77 A PIC 99 VALUE ZERO. 77 B PIC 99 VALUE ZERO. PROCEDURE DIVISION. MAIN SECTION. P1. MOVE 44 TO A. MOVE 72 TO B. ADD A TO B ON SIZE ERROR PERFORM PROC-A END-ADD STOP RUN. PROC-A. DISPLAY "Laengenfehler!" UPON T. DISPLAY A UPON T. DISPLAY B UPON T.
Aktueller Wert von A: 44
Aktueller Wert von B: 72
Errechnetes Ergebnis: 116
Das Ergebnisfeld B ist zu klein, um das errechnete Ergebnis aufzunehmen, und die Überlaufbedingung tritt ein. Da ON SIZE ERROR angegeben wurde, wird die Anweisung PERFORM PROC-A ausgeführt. Das Ergebnisfeld B bleibt unverändert.