-2

我在 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 中的值是相同的。首先,我不明白这个逻辑是否有任何意义。如果是这样,为什么我会为不同的输入获得相同的值?

4

2 回答 2

1

一个 18 位二进制只占用 8 个字节。

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

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

我既看不到也猜不到代码中的任何目的。我不知道 116:8 是什么。从表面上看,MOVE WKO-DATA-RECORD(116:8) TO WS-BINARY 代替前两个 MOVE 会得到不同的结果。结果是否正确完全取决于数据,以及数据的含义。

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

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

于 2013-09-26T22:36:46.490 回答
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 字段向左同步,而 PIC 9 USAGE BINARY 字段在计算机内同步向右,因此数据对齐、计算机字中的位位置和强制数据类型转换产生了无论 WS-CHARS 中的原始值如何,“相同的数据移动错误”。底线是你的编码不​​好。

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

于 2015-05-11T18:21:14.103 回答