字母数字运动到数字

| 字母数字移动到数值变量会导致意外结果。这是代码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
结果很奇怪,想弄清楚为什么将\'1 \'作为\'1 0 \'移到数值变量中,有趣的是,对它进行条件化也没有问题。请分享您的观点。感谢您的关注。     
已邀请:
基本上,您做了非法的
MOVE
。将字母数字移动到数字字段是有效的 前提是字母数字字段的内容仅包含数字字符。 这个参考 总结有效/无效的动作。 结果是您期望什么? 将字母数字字段移到数字字段时无需进行任何操作 \'转换\'。基本上,您只是将一个数字后跟两个空格放在一个数字字段中。 '1'还可以,两个空格 不是。 “ 2”的最后两个字节包含空格。 但是等等...为什么最后一个字符为零?答案很复杂。 声明为“ 3”的项目用区域小数表示。 分区十进制数字的每个数字都由一个字节表示。 每个字节的4个高阶位是区域位;低位字节的4个高位位代表 项目的标志。每个字节的4个低位包含该数字的值。这里的关键 是标志的存储位置。它位于最后一个字节的高位。您的声明没有 包含一个符号,以便
MOVE
语句删除符号位并将其替换为默认值 数字高阶位(请记住,MOVE唯一有效的字符是数字-因此, 修补程序应始终产生有效的结果)。无符号分区小数的高位 数字始终为HEXF。最后一个字节的低位是多少?一个空格的ebcdic HEX值为40。零为HEX F0。由于MOVE语句会自动“修复”该符号,因此您最终得到的HEX F0为低位数字,您猜到它恰好为零。其他“数字”都不包含符号位,因此它们保留为 他们是。 最后,“ 5”语句将带小数的十进制字段转换为等效的字符表示形式 用于演示:净结果为:\'1 0 \'。 顺便说一句,上面的讨论是如何在IBM z / OS平台上实现的-其他字符集(例如ASCII)和/或其他平台可能会产生不同的结果,不是因为IBM做错了事,而是因为程序在做非法的“ 1”,结果基本上是不确定的。     

要回复问题请先登录注册