2011-05-26 72 views
1

字母数字移动到数字变量导致意外结果。下面是代码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 0”到数字变量,有趣有调理NO问题它。请分享您的观点。感谢您的关注。

+0

我会检查这是不是一个DISPLAY错误(或功能)。试着写一个'IF WS-VAR-NUM EQUAL 1 THEN ...'来检查真实内容。 – 2011-05-26 05:53:59

+0

尝试移动'001'到WS-VAR-STR。将'1'移至WS-VAR-STR移动'1'。移动不会进行类型转换。 – tonyriddle 2011-05-26 14:06:45

+0

@tony请参阅此示例http://www.tek-tips.com/viewthread.cfm?qid=705710 – 2011-05-26 15:55:42

回答

3

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

作为一个结果,你期待什么?

将字母数字字段移动为数字字段的操作不需要 '转换'。基本上你只是把一个数字后面跟两个空格放到一个数字字段中。 '1'没问题,两个空格 没有。 WS-VAR-NUM的最后两个字节包含空格。

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

最后,DISPLAY语句将分区的十进制字段转换为其等效字符表示 用于表示:Net结果为:'1 0'。上述讨论是如何在IBM z/OS平台上实现的 - 其他字符集(例如ASCII)和/或其他平台可能产生不同的结果,这不是因为IBM做错了事,但因为该程序正在执行非法操作,所以结果基本上是不确定的。

+0

感谢这样一位耐心而清晰的解释,尽管我很清楚我碰巧做出了非法行为。同时感谢您理解我的意图,以找出此类移动后结果的原因。你有没有提到要理解这一点,如果是的话,请分享那些有价值的东西......这确实值得! – 2011-05-30 08:05:31