【问题标题】:Alphanumeric movement to Numeric字母数字移动到数字
【发布时间】:2011-05-26 04:36:15
【问题描述】:

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

  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

结果很奇怪,想弄清楚为什么将“1”作为“1 0”移动到数字变量中,有趣的是,调节它也没有问题。分享你的观点。感谢您的关注。

【问题讨论】:

  • 我会检查这是否不是 DISPLAY 错误(或功能)。尝试写IF WS-VAR-NUM EQUAL 1 THEN ...查看真实内容。
  • 尝试将“001”移动到 WS-VAR-STR。将“1”移动到 WS-VAR-STR 移动“1”。 Move 不进行类型转换。
  • @belisarius 您提供的链接中的转换子程序是我们的做法。它删除非数字字符,右对齐数字字符并用零填充字段。然后可以将此结果移至数值字段。

标签: cobol mainframe alphanumeric


【解决方案1】:

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

您期望结果是什么?

将字母数字字段移动到数字字段无需 '转换'。基本上,您只需将一个数字后跟两个空格放入数字字段中。 '1' 没问题,两个空格 不是。 WS-VAR-NUM 的最后两个字节包含空格。

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

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

顺便说一句 上面的讨论是它在 IBM z/OS 平台上的工作方式 - 其他字符集(例如 ASCII)和/或其他平台可能会产生不同的结果,而不是因为 IBM 正在做错误的事情,但是因为程序正在执行非法MOVE 并且结果基本上是未定义的。

【讨论】:

  • 感谢您如此耐心和清晰的解释,尽管很明显我碰巧做了非法举动。也感谢您理解我打算在这种运动后找出结果的原因。你有没有参考什么来理解这个,如果有,请分享那些有价值的东西……这确实值得!
猜你喜欢
  • 1970-01-01
  • 2020-11-11
  • 2017-06-05
  • 2017-10-31
  • 2011-09-20
  • 2019-09-28
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多