假设我有一个包含9字节长数据的PS输入文件。输入数据将是必须左对齐的数字。因此,如果输入文件中的数字小于9个字节,则数字将以空格尾随
当我将这样的数字读入9(9)
变量并且DISPLAY
时,显示的值将是后跟空格的数字(在假脱机中使用SET HEX ON
进行检查)。
但是,当我MOVE
将9(9)
变量中的值转换为S9(9) COMP
变量,然后DISPLAY
为其值时,显示的值将是一些随机数值。
我的问题是,在上面的场景中,COBOL如何解释/转换S9(9) COMP
变量的值?
答案 0 :(得分:2)
它是一台计算机,你得到的结果远非随意。
您认为会发生什么?
您正在向二进制字段移动非数字但已定义为数字的内容。您将获得与您的数据相关的值,而不是您期望的值。
您有编译器选项NUMPROC(NOPFD)。如果您有NUMPROC(PFD),您将获得S0C7异常终止,
您应该会发现所有尾随空格都被视为零,并使用NUMPROC(NOPFD)。
在计算之前的分区小数,或者在转换为二进制的情况下,是#34;打包"。这意味着所有区域都被抛弃,标志和最终数字相反。
因此,在打包号码中,您只能获得数字和符号。
只要所有数字都是0-9并且符号是A-F,则没有S0C7。结果乱码,但没有S0C7。
如果我们考虑你的最后两个尾随空格,X'4040'
。您有NUMPROC(NOPFD),因此编译器将"修复"你的标志(在这种情况下为F
)。抛出区域(所以前4个)交换最后一个字节(变为X'04'
),修复符号(变为X'0F'
)并将该值转换为二进制(成功)。您已将空格变为零。
如果使用NUMPROC(PFD),则不会发生符号修复,转换为二进制(CVB)会产生S0C7异常终止。