如何打包十进制存储值。如何为变量类型PIC S9(09)V99 COMP-3的压缩十进制编写节点js逻辑

我在文件中具有PIC S9(09)V99 COMP-3和PIC S9(07)COMP-3类型的变量。我需要解析它并获取节点js中的值。您能否通过简单的例子帮助我理解它。还可以帮助我了解相同数据的存储方式

lixiaoxuaner 回答:如何打包十进制存储值。如何为变量类型PIC S9(09)V99 COMP-3的压缩十进制编写节点js逻辑

Cobol处理数字的自然方式是二进制编码的十进制又称BCD。

  1. “经典”图片(用法显示)

    理论:

    当您编写的USAGE值为DISPLAY的PIC S9(4)V9(3)时,即不编写COMP-3,就是BCD。

    以这种写数字的方式,一个数字用一个八位位组(即8位)存储。 每个八位位组可以分为两个四位组,也称为半字节。四重奏是一组4位。因此写一个数字需要两个四重奏,也就是说2 * 4位加起来等于8位= 1个八位位组。

    写入数字时,第一个四重奏将保留一个值,该值代表该数字携带的符号。带有符号的唯一数字是最后一位。正值为十六进制的C(类似于信用),二进制值为1100。负数是十六进制的D(如Debit),二进制是1101。中性字母十六进制为F,二进制为1111。

    第二个四重奏将保存您的数字的二进制值。例如,如果我的数字为7,则四重奏将为0111。

    示例:

    如果以我在PIC S9(4)V9(3)上方编写的示例为例,它具有4 + 3 = 7位数字。它需要存储7个八位位组。假设我要存储号码+0036.421

    那么7个八位字节将是0033421

    • 第一位数0:1111 0000;在十六进制中是:F0
    • 第二个数字0:1111 0000;在十六进制中是:F0
    • 第三位数3:1111 0011;在Hew中是:F3
    • 第四位数6:1111 0110;在十六进制中是:F6
    • 第五位4:1111 0100;在十六进制中是:F4
    • 第六位数字:1111 0010;在十六进制中是:F2
    • 第七位数1:1100 0001;在十六进制中是:C1。该数字代表整数的符号。第一个四重奏是C,因为数字是正数。
  2. COMP-3 PIC(十进制压缩)

    理论: 如您所见,写入一个相当小的数字会占用很多空间(7个八位位组!!)。为了进行比较,可以在具有七个字节的二进制文件中存储2 ^ 56个值! 因此,为了保留一些内存,还有另一种格式,即打包十进制,可以通过在声明中添加COMP-3来使用。

    采用这种格式,而不是将数字存储在整个八位字节中,您只需要四重奏即可。诀窍是不要存储不是最后一位数字的符号。因为如上所示,大多数四重奏的第一个四重奏都具有F值,几乎无法传达任何信息。

    最后一个八位位组的最后一个四重奏包含整数的符号。因此,如果我们有n位数字,则需要n + 1个四重​​奏来将数字存储为压缩十进制。因此,用小数点后一位n位数字占据的空间将为foor((n + 1)/ 2)。也就是说,包含n + 1个四重​​奏的最低八位字节数。

    示例: 我的图片长7位,所以我需要7 + 1 = 8个四重奏= 4个八位位组。

    • 第一个八位位组:0000 0000;十六进制为00(第一个数字为0,第二个数字为0)
    • 第二个八位字节:0011 0110;用十六进制表示,该数字为36(第三个数字为3,第四个数字为6)
    • 第三八位字节:0100 0010;十六进制为42(第五位为4,第六位为2)
    • 第四个八位位组:0001 1100;十六进制为1C(第七位数字为1,整数的符号为+)
本文链接:https://www.f2er.com/2756232.html

大家都在问