OpenCOBOL1.1中SIGN IS TRAILING SEPARATE字段NUMERIC判断异常问题
OpenCOBOL 1.1中REDEFINES与SIGN IS TRAILING SEPARATE组合的异常原因
问题代码
03 WS-INP PIC X(30). 03 WS-INP-D REDEFINES WS-INP. 05 WS-AMT1 PIC S9(6)V99 SIGN IS TRAILING SEPARATE. MOVE 'QQQQQQQQQQQQ' TO WS-INP DISPLAY WS-INP IF WS-AMT1 NOT NUMERIC DISPLAY WS-AMT1 END-IF DISPLAY WS-INP
异常现象
执行代码后,WS-INP的原值'QQQQQQQQQQQQ'被修改为'QQQQQQQQQQ-Q',不符合原值保留的预期。移除SIGN IS TRAILING SEPARATE定义后,该异常消失。
原因分析
这是OpenCOBOL 1.1的特定实现行为:
- 当对带有
SIGN IS TRAILING SEPARATE的数值项执行NOT NUMERIC检查时,编译器会尝试对符号位做规范化处理——哪怕当前数据是非数值的,它也会强制把该数值项的符号位位置(也就是WS-AMT1的最后一个字节)替换为默认的符号标记(此处为减号-)。 - 由于
WS-INP-D通过REDEFINES共享WS-INP的内存空间,这种符号位修改会直接覆盖原WS-INP对应位置的字符,导致原数据被篡改。 - 如果去掉
SIGN IS TRAILING SEPARATE,数值项的符号内嵌在数字位中,此时执行NOT NUMERIC检查不会触发自动修改符号位的操作,原WS-INP的内容就能保留。
内容的提问来源于stack exchange,提问作者llx
相关产品推荐
相关产品推荐

