字母数字移动到数字变量会导致意外结果。这是代码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 :(得分: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
,结果基本上是未定义的。