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