问题描述
|
字母数字移动到数值变量会导致意外结果。这是代码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”,结果基本上是不确定的。