如何将COMP-5类型的值移动到普通数值字段?
问题原因
- 你定义的源字段
O-Xid2-length是带符号2字节二进制类型(S9999 COMP-5),取值范围是-32768+32767,而目标字段`WS-O-Xid2-length`是无符号4位十进制类型,仅支持09999的取值,两种情况会触发转换后置0:- 源字段实际值为负数,目标字段无符号无法匹配
- 源字段实际值大于9999,超过目标字段的存储上限
- 你直接显示COMP-5字段正常,是因为COBOL的
DISPLAY语句默认会对二进制类型做完整转换输出,不会受目标字段限制,所以看不到异常。
解决方法
- 先确认源字段的实际取值范围,调整目标字段的定义匹配源的能力:
如果不需要保留符号且源最大值不超过99999,修改目标字段为:
12 WS-O-Xid2-length PIC 9(5).
如果需要保留符号,修改为:
12 WS-O-Xid2-length PIC S9(5).
- 如果确定源字段的取值不会超出4位无符号范围,可以先做合法性校验再赋值,避免异常值置0:
IF O-Xid2-length >= 0 AND O-Xid2-length <=9999 MOVE O-Xid2-length TO WS-O-Xid2-length ELSE *> 这里加异常处理逻辑 END-IF
- 如果是跨系统传输导致的字节序不匹配问题,可以通过重定义交换字节顺序后再赋值:
01 WS-COMP5-TMP. 05 TMP-COMP5 PIC S9999 COMP-5 SYNC. 05 TMP-BYTE REDEFINES TMP-COMP5 PIC X(02). 01 WS-REVERSED-BYTE PIC X(02). MOVE O-Xid2-length TO TMP-COMP5 MOVE TMP-BYTE(2:1) TO WS-REVERSED-BYTE(1:1) MOVE TMP-BYTE(1:1) TO WS-REVERSED-BYTE(2:1) MOVE WS-REVERSED-BYTE TO TMP-BYTE MOVE TMP-COMP5 TO WS-O-Xid2-length
内容的提问来源于stack exchange,提问作者Surbhi Sharma
相关产品推荐
相关产品推荐

