IDENTIFICATION DIVISION. PROGRAM-ID. CompOverflow. *> COMP/数值溢出測試 *> Coverage: NP-A004 (COMP赋值溢出), KB-A002 (累加器溢出SIZE ERROR) ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. *> NP-A004: COMP溢出 01 WS-COMP-SMALL PIC S9(4) USAGE COMP. 01 WS-COMP-BIG PIC S9(8) USAGE COMP. 01 WS-COMP-RESULT PIC S9(4) USAGE COMP. 01 WS-OVERFLOW-VAL PIC 9(10) VALUE 999999. *> KB-A002: 累加器溢出(SIZE ERROR) 01 WS-ACCUMULATOR PIC 9(4) VALUE 0. 01 WS-BIG-AMOUNT PIC 9(6). 01 WS-VALUES. 05 WS-VAL-1 PIC 9(6) VALUE 5000. 05 WS-VAL-2 PIC 9(6) VALUE 5000. 05 WS-VAL-3 PIC 9(6) VALUE 50000. 01 WS-I PIC 9(2). 01 WS-PASS PIC 9(2) VALUE 0. 01 WS-FAIL PIC 9(2) VALUE 0. PROCEDURE DIVISION. MAIN. DISPLAY "COMP-OVERFLOW: Starting overflow tests" *> NP-A004: COMP赋值溢出 DISPLAY "NP-A004: COMP assignment overflow" *> Test 1: COMP(4)正常値 MOVE 1000 TO WS-COMP-SMALL. MOVE 1000 TO WS-COMP-RESULT. IF WS-COMP-RESULT = 1000 ADD 1 TO WS-PASS DISPLAY "NP-A004-1: COMP(4)=1000 PASS" ELSE ADD 1 TO WS-FAIL DISPLAY "NP-A004-1: FAIL" END-IF. *> Test 2: COMP(4)正常辺界値 MOVE 9999 TO WS-COMP-SMALL. MOVE 9999 TO WS-COMP-RESULT. IF WS-COMP-RESULT = 9999 ADD 1 TO WS-PASS DISPLAY "NP-A004-2: COMP(4)=9999 PASS" ELSE ADD 1 TO WS-FAIL DISPLAY "NP-A004-2: FAIL" END-IF. *> Test 3: COMP(4)負數 MOVE -9999 TO WS-COMP-SMALL. MOVE -9999 TO WS-COMP-RESULT. IF WS-COMP-RESULT = -9999 ADD 1 TO WS-PASS DISPLAY "NP-A004-3: COMP(4)=-9999 PASS" ELSE ADD 1 TO WS-FAIL DISPLAY "NP-A004-3: FAIL" END-IF. *> Test 4: COMP(8)大値 MOVE 99999999 TO WS-COMP-BIG. IF WS-COMP-BIG = 99999999 ADD 1 TO WS-PASS DISPLAY "NP-A004-4: COMP(8)=99999999 PASS" ELSE ADD 1 TO WS-FAIL DISPLAY "NP-A004-4: FAIL" END-IF. *> KB-A002: 累加器溢出(SIZE ERROR) DISPLAY "KB-A002: Accumulator overflow (SIZE ERROR)" MOVE 0 TO WS-ACCUMULATOR. *> 故意溢出:5000+5000+50000 = 60000 > 9999 PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 3 IF WS-I = 1 MOVE WS-VAL-1 TO WS-BIG-AMOUNT ELSE IF WS-I = 2 MOVE WS-VAL-2 TO WS-BIG-AMOUNT ELSE MOVE WS-VAL-3 TO WS-BIG-AMOUNT END-IF ADD WS-BIG-AMOUNT TO WS-ACCUMULATOR ON SIZE ERROR DISPLAY "KB-A002: SIZE ERROR at ADD " WS-BIG-AMOUNT " acc=" WS-ACCUMULATOR ADD 1 TO WS-PASS NOT ON SIZE ERROR DISPLAY "KB-A002: ADD " WS-BIG-AMOUNT " -> acc=" WS-ACCUMULATOR END-ADD END-PERFORM. IF WS-PASS >= 1 ADD 1 TO WS-PASS DISPLAY "KB-A002: PASS - SIZE ERROR handled" ELSE ADD 1 TO WS-FAIL DISPLAY "KB-A002: FAIL" END-IF. DISPLAY " " DISPLAY "COMP-OVERFLOW: PASS=" WS-PASS " FAIL=" WS-FAIL IF WS-FAIL = 0 DISPLAY "COMP-OVERFLOW: ALL PASSED" STOP RUN RETURNING 0 ELSE DISPLAY "COMP-OVERFLOW: FAILED" STOP RUN RETURNING 1 END-IF . END PROGRAM CompOverflow.