如何将 COMP-5 值移动到数字字段?

How to move COMP-5 values to a Numeric field?

我正在尝试将 COMP-5 变量(我从其他系统接收的)移动到数字字段。我注意到,当我显示 COMP-5 变量时,我可以看到该值,但是当我尝试移动它时,COMP-5 变量中的值变为 zeros.I 没有任何使用 COMP-5 的经验。有人可以帮我解决这个问题吗?

代码:

   09 O-Xid.                                                
     12 O-Xid2-length                   PIC S9999 COMP-5 SYNC.                                                       
     12 O-Xid2                          PIC X(255).   
   09 WS-O-Xid.                                             
     12 WS-O-Xid2-length                PIC 9999.        
     12 WS-O-Xid2                       PIC X(255).      
      
                                                              
MOVE O-Xid2-length         TO WS-O-Xid2-length       
MOVE O-Xid2                TO WS-O-Xid2              
只要数据有效,

MOVE 就会在任何数字 USAGE 之间进行任何必要的转换。

代码遗漏了实际的 DISPLAY 语句,我 假设 您已经使用 DISPLAY O-Xid2-length 测试了有效数据(请指定输出)。

目标不包含源值的最可能原因是:
您使用的 COBOL 环境(您既没有指定编译器也没有指定您使用的选项)不会根据 ANSI/ISO 截断 COMP-5 值 - 因此它可能包含“10000”,然后在 MOVE 因为目标无法保存该值(此处发生的标准截断仅保留最后 4 位数字)。
所有其他情况都会出现“字段中没有您认为的数据”——再次说明:请同时指定“DISPLAY”语句和结果。

TRUNC(BIN) 的附加信息:根据 docs

  • BINARY 当接收方为数字时,发送字段被处理为半字、全字或双字
  • DISPLAY 将转换二进制字段的全部内容,不截断。

DISPLAY 也会显示类似 30000 的值,我 认为 在这种情况下 MOVE 会导致零值。


对于其他用法,存储在变量中的值可能实际上不是有效数据,但这不适用于BINARY(或COMP-5 项)。在这种情况下,使用的 COBOL 环境可以对 DISPLAY 进行一些自动更正,但对 MOVE 只需将无效值更改为 ZERO;检查您是否需要使用调试器或十六进制转储收到的值。