字母数字运动到数字

时间:2011-05-26 04:36:16

标签: cobol mainframe alphanumeric

字母数字移动到数字变量会导致意外结果。这是代码fyr:

  DATA DIVISION.                                 
  WORKING-STORAGE SECTION.                       
  01  WS-VAR-STR       PIC X(3) VALUE SPACES.                
  01  WS-VAR-NUM       PIC 9(3) VALUE ZEROES. 
  PROCEDURE DIVISION.                            
      MOVE '1'         TO WS-VAR-STR                  
      MOVE WS-VAR-STR  TO WS-VAR-NUM
      DISPLAY 'STRING > ' WS-VAR-STR '< MOVED > ' WS-VAR-NUM '<'

      IF WS-VAR-NUM >= 40 AND <= 59
         DISPLAY 'INSIDE IF >' WS-VAR-NUM
      ELSE 
         DISPLAY 'INSIDE ELSE >' WS-VAR-NUM
      END-IF
      GOBACK                                     
      .  

    OUTPUT:
    STRING > 1  < MOVED > 1 0<
    INSIDE ELSE >1 O

结果是bizzare并且想要解释为什么'1'被'1'移动到数字变量中,并且有趣的是在调节它时也没有问题。分享您的观点。谢谢你的兴趣。

1 个答案:

答案 0 :(得分:3)

基本上你做了非法的MOVE。将字母数字移动到数字字段是有效的 只要字母数字字段的内容仅包含数字字符。 这reference 总结了有效/无效的动作。

你期待什么结果?

不使用字母数字字段移动到数字字段 “转化”。基本上你只是将一个数字后跟两个空格放入数字字段。 '1'没关系,两个空格 不是。 WS-VAR-NUM的最后两个字节包含空格。

但是等等......为什么最后一个字符为零?对此的答案有点复杂。 声明为PIC 9的项目以Zoned Decimal表示。 分区十进制数的每个数字由单个字节表示。 每个字节的4个高位是区域位;低位字节的4个高位表示 该项目的标志。每个字节的4个低位包含数字的值。关键在这里 是存储标志的地方。它位于最后一个字节的高位。你的声明没有 包含一个符号,以便MOVE语句吹走符号位并用默认值替换它们 数字高位(记住MOVE中唯一有效的字符是数字 - 所以这个 补丁过程应始终产生有效的结果)。无符号分区十进制的高位 数字总是HEX F.最后一个字节的低位是什么?空格的十进制HEX值为40.零是HEX F0。由于MOVE语句会自动“修复”符号,因此您最终会得到低位数的HEX F0,恰好是您猜对了零。其他'数字'都不包含符号位,所以它们保留为 他们是。

最后,DISPLAY语句将分区的十进制字段转换为等效的字符表示形式 用于演示:净结果为:'1 0'。

BTW 以上讨论是如何在IBM z / OS平台上运行的 - 其他字符集(例如ASCII)和/或其他平台可能产生不同的结果,而不是因为IBM正在做这是错误的,但因为该程序正在执行非法MOVE,结果基本上是未定义的。