你也想在另一个程序后“解压”你的约会,所以使用REDEFINES而不是下属填充十进制组:
05 WD-DDMMYY-DT-NUMERIC PIC 9(06).
05 WD-DDMMYY-DT-PD PACKED-DECIMAL PIC 9(06)V9
VALUE ZERO.
05 FILLER
REDEFINES
WD-DDMMYY-DT-PD.
10 WD-BCD PIC X(03).
10 FILLER PIC X.
MOVE WD-DDMMYY-DT-NUMERIC TO WD-DDMMYY-DT-PD
MOVE WD-BCD TO wherever-you-want
低位半字节(半字节)表示操作符号(C表示正数,D表示负数,F表示无操作符号,被视为正数 - 也有一些非首选符号,A,B,E)。
对于压缩十进制的数字部分,一位数字需要一个nybble。
对于压缩十进制数,任何给定的字节数都会允许奇数个数位恰好符合。偶数位数字必须始终以零为前缀(您不用担心,编译器会为您执行此操作)。
要获得“包装”六个十进制数字为三个字节,你必须忽略符号(记住,一个半字节用于甚至无符号场)。这个结果是一个称为二进制编码十进制(BCD)的约定。 COBOL没有对BCD的本地支持,所以你必须编码。但并不多。
为了让标志变得方便起见,您需要将您的数字转移到左侧的一个nybble,同时将您的标志留在原来的位置。单独留下标志不是问题,COBOL会为您做到这一点。向左移动就像乘以10的乘方。要移动一个左边,乘以10.
但是,有一种更好的方式来安排移位,即定义压缩十进制字段以使其具有一个小数位(V9)。当你的日期,显然是一个整数,移动到这个字段时,小数部分将为零(一位数),日期日期将在零之前。
值得注意的是与IBM企业COBOL V5由10的幂的任何乘法或除法作为适当的移位实际上实现。
这将意味着由V5编译器生成的代码将是由10乘法和进入到一个带有一个小数位非常相似。也许相同(我无法检查)。
要 “解压” 日期:
05 WD-DDMMYY-DT-NUMERIC PIC 9(06).
05 WD-DDMMYY-DT-PD PACKED-DECIMAL PIC 9(06)V9
VALUE ZERO.
05 FILLER
REDEFINES
WD-DDMMYY-DT-PD.
10 WD-BCD PIC X(03).
10 FILLER PIC X.
MOVE wherever-you-want TO WD-BCD
MOVE WD-DDMMYY-DT-PD TO WD-DDMMYY-DT-NUMERIC
注意零值在这个定义。企业COBOL的工作方式(无论如何是V4.2)实际上并不是必须的,但它对程序员来说是纪录片。低位字节(第四个)永远不会从其初始值改变,这意味着它始终包含X'0F'。编译器实际上会“短路”这个,因为它会强制输出无论如何都是无符号的,所以不需要来自源字段的符号。
您是否可以包含一些示例日期以及您希望在三个字节中查看这些日期的内容? –