二进制在COBOL程序中的使用

二进制在COBOL程序中的使用,cobol,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-RE

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

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

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

如果您得到的是一个常量输出,那么看起来像是对二进制字段进行了“字符”移动,因此从WS-character-STRING的开始算起8个字节,WS-character-STRING具有常量值。如果你告诉我们这个值(我怀疑它是X'00002020202020'作为小数点),我们可以确认

我既看不见也猜不出现行守则的任何目的。我不知道116:8是什么。从表面上看,将WKO-DATA-RECORD(116:8)移动到WS-BINARY来代替前两个移动将得到不同的结果。结果是否正确完全取决于数据和数据的含义

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


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

我刚刚使用了一个涉及二进制、显示和显示编辑的数字数据项的代码示例

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

一般来说,应避免将数据移动到定义不同的其他区域。否则,您将得到关于“将字母移动到数字可能会产生意外结果”的诊断消息。这意味着最终结果可能不是你想要的

根据我的UNISYS系统COBOL手册(IBM配置可能不同),PIC 9(18)二进制文件由63位或7个ASCII字节组成。在您的示例中,您正在将16字节的用法显示字段移动到7字节的用法二进制字段

这可能看起来没什么大不了的,您可以假设编译器将对值的显示到二进制转换进行内部调整

但是,数据定义的主要问题是发送和接收数据字段不在单词边界上。05级数据项不放在字边界上的内存中,这意味着此类数据字段的传输需要将计算机内存字的部分分离,然后转换为其他数据定义类型

很有可能,16到7字节move指令的最终结果产生了一个巨大的二进制值结果,该结果会传递到最后两个move命令

代码的另一个主要问题是,PIC X使用显示字段在左侧同步,而PIC 9使用二进制字段在计算机内部在右侧同步,因此数据对齐、计算机字内的位位置和强制数据类型转换产生了“相同的数据移动错误”不考虑WS-CHARS中的原始值。底线是你的编码不好


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

不确定标准,但我看到的大多数Cobol编译器都将组视为Pic-X字段是的,而且我认为将Pic X移动到二进制是不标准的。然而,在显示的代码中,它似乎没有编译错误——除非没有注意到错误,然后运行了不完整的“对象”,这可能是一种可能性。是的,设置WS-CHARS,然后移动WS-CHARACTER-STRING会在字符集前面给你2个空值和6个空格。不在这件事上我和比尔是一致的。00002020…@BRIFIN 000202020。。。是十六进制表示法,转换为他可能看到的十进制数
WS-RESULT:00003532350018592
displayedTS/OP四小时前看到的。我绝对相信他们正在收集他们所能收集的所有信息,并将随时编辑他们的问题。如果没有某种上下文,这是毫无意义的代码。你能告诉我们你认为这里的目标是什么吗?在那之前,我认为没有人能提供太多帮助。七个字节?从什么时候开始ASCII有9位字节了?我们不知道使用了什么COBOL或OS,但我希望9(18)二进制文件使用64位。也许你必须注意Unisys系统上的边界对齐。我不知道还有什么地方你需要麻烦。OP已经一年多没有露面了,所以不要期望他们有太多的反馈。