在COBOL计划中使用BINARY

时间:2013-09-26 22:20:14

标签: cobol

我在COBOL程序中有以下代码。

05  WS-CHARACTER-STRING.                               
   10  WS-CHARS-LOW-VALUES     PIC X(08) VALUE X'0000'.   
   10  WS-CHARS                PIC X(08).  
.
.
.          
05  WS-BINARY                 PIC 9(18) BINARY.  
05  WS-RESULT                 PIC 9(18).  
.
.
.  
MOVE WKO-DATA-RECORD(116:8) TO WS-CHARS   
DISPLAY ' WS-CHARS:' WS-CHARS              
MOVE WS-CHARACTER-STRING    TO WS-BINARY   
DISPLAY ' WS-BINARY:' WS-BINARY          
MOVE WS-BINARY              TO WS-RESULT  
DISPLAY ' WS-RESULT:' WS-RESULT         

传递给WS-CHARS的8个字符是不同的有效值。但是,WS-RESULT中的输出始终是相同的值。我输入要显示的消息来检查WS-BINARY和WS-RESULT中的值是否相同。 首先,我不明白这个逻辑是否有任何意义。如果是这样,为什么我为不同的输入获得相同的值?

2 个答案:

答案 0 :(得分:1)

18位二进制文​​件只占用8个字节。

我不认为COBOL编译器允许将组字段(WS-CHARACTER-STRING)移动到二进制字段是“标准”的事情。

如果你得到一个常量输出,它看起来像是一个“字符”MOVE正在对二进制字段进行,所以从WS-CHARACTER-STRING开始的八个字节,它具有一个常量值。如果你告诉我们价值(我怀疑它是X'0000202020202020'作为小数)我们可以确认。

我无法在代码中看到或猜出任何目的。我不知道116:8是什么。从表面上看,将WKO-DATA-RECORD(116:8)移动到WS-BINARY代替前两个MOVE可以得到不同的结果。结果是否正确完全取决于数据和数据的含义。

通常,在二进制值前加上X'0000',然后将结果字段作为二进制处理,与除以65536相同,但速度要快得多。但是,如果这是意图,则数据定义需要不同。

请使用尽可能多的信息更新您的问题,包括编译器名称和操作系统。

答案 1 :(得分:0)

我刚刚使用了涉及BINARY,DISPLAY和DISPLAY EDITED数字数据项的代码示例。

当移动具有不同类型描述的数据项时,编译器将在内部进行某些调整。

作为一般规则,您应避免将数据移动到另一个定义不同的区域。否则,您将收到关于"将alpha移动到数字的诊断消息可能会产生意外结果"。这意味着最终结果可能不是您想要的。

从我的UNISYS系统的COBOL手册(IBM配置可能不同),PIC 9(18)BINARY由63位或7个ASCII字节组成。在您的示例中,您将16字节的USAGE DISPLAY字段移动到7字节的USAGE BINARY字段。

这似乎没什么大不了的,您可以假设编译器会对值的DISPLAY到BINARY转换进行内部调整。

但是,数据定义的主要问题是发送和接收数据字段不在字边界上。 05级数据项不在内部存储在字边界上,这意味着这些数据字段的传输受到计算机存储器字的一部分被拆开然后转换成其他数据定义类型的影响。

很可能,16到7字节移动指令的最终结果产生了一个巨大的二进制值结果,该结果延续到最后两个MOVE命令。

代码的另一个主要问题是PIC X USAGE DISPLAY字段是LEFT同步的,而PIC 9 USAGE BINARY字段在计算机内是同步的,所以数据对齐,计算机字中的位位置和强制数据类型转换生成了相同的数据移动错误"无论WS-CHARS中的原始值如何。最重要的是你编码不好。

为了更好地理解这一点,你需要采用我最初编程的汇编语言编程。