我试图理解COBOL变量和COMP Usage子句是如何存储值的。
我尝试了一个示例,如下所示
01 VAR14 PIC S9(5) USAGE COMP.
MOVE 12345 TO VAR14
DISPLAY VAR14在假脱机中,VAR14的值将以0000012345的形式出现。根据手册,S9(5) COMP的大小是4字节,所以我的理解是VAR14应该显示为000012345。二进制表示如下:
0000 0000 0000 0000 0011 0000 0011 0100有人能帮我理解一下输出值0000012345吗?
谢谢
发布于 2017-02-24 02:29:05
在IBM的Enterprise COBOL中,有四种定义二进制域的方法: COMP;COMP-4;BINARY;COMP-5。
这是怎么回事呢?计算字段(COMP的缩写,这里是“所有计算字段”的缩写)是“实现者定义的”。这意味着在一个编译器中什么是COMP-东西,在另一个编译器中可能是COMP-东西,甚至可能没有直接的等价物。
是的,如果你愿意,你可以编写计算性的,计算性的-4和计算性的-5。编译器会很高兴的。
为了标准化,1985年的COBOL标准引入了二进制和压缩十进制作为用法。考虑到其他COBOL编译器的可移植性,这将是COMP和COMP-3 (压缩十进制)字段的最佳用法。
这些不同的二进制字段之间有什么区别?大多数情况下,没有。在编译器中,COMP、COMP-4和BINARY实际上是彼此的同义词(更准确地说,COMP-4和BINARY是COMP的同义词)。
COMP-5,也被称为“本机二进制”,是不同的。COBOL有你可能称之为“十进制-二进制”的字段(COMP和siblings)。也就是说,数据以二进制形式存储,但它的最大值和最小值是定义中使用的PICture子句的数量和全值。
COMP PIC 9 - can contain zero to nine.
COMP PIC S99 - (signed) can contain -99 to +99.
COMP PIC 999 - can contain zero to 999.COMP-5则不同。
COMP PIC 9 - can contain zero to 65535.
COMP PIC S99 - (signed) can contain -32768 to +32767.
COMP PIC 999 - can contain zero to 65535.对于COMP-5,PICture用于定义字段的大小(与其他二进制字段一样),但每个可能的比特值都是有效的。
PICture与定义的大小有何关系?PIC9至PIC9(4)将存储在半字大小的字段中(即两个字节)。PIC9(5)至PIC9(9)将存储在字大小的字段中(为四个字节)。PIC9(10)至PIC9(18)将存储在双字大小的字段(8字节)中。
好的,那么这种差异( COMP -5使用所有的位,COMP只能表示PICture的十进制值)如何影响所定义的内容?“原生二进制”听起来不是比任何“非原生”都要好得多,而且明显更快吗?
不同之处在于它们如何截断。而且,由于截断,它与“原生二进制”的声音一样闪烁,通常比使用COMP & CO慢。
COMP截断为PICture的十进制值。COMP-5将截断为字段的大小。
考虑(名称仅用于演示,仅使用描述性名称):
01 PROGA COMP PIC 9(4).
01 PROGB COMP-5 PIC 9(5).
01 PROGC BINARY PIC 9(4) VALUE 9999.
ADD PROGC TO PROGA
ADD PROGC TO PROGB记住PROGA的最大值是9999,并且注意到19998可以很容易地适应字段的现有大小,编译器可以实现加法,然后截断为十进制值,所有都在原地。
记住PROGB的最大值是65535,并且在原始字段中有足够的空间成功地再添加65535的可能性非常小,编译器必须生成一个两倍于原始大小的临时字段,执行加法,然后截断回原始最大值,将结果返回到原始字段。
ADD 1 TO PROGA
ADD 1 TO PROGB请注意,对于这两个,将1加到程序A中,因为它小于9999,仍然允许在适当的位置进行加法(显然),但是将1加到PROGB仍然需要字段的扩展和所有那些乱七八糟的东西,因为PROGB中可能已经有一个65535的值,所以编译器必须考虑到这一点。
来展示一下。您有COMP PIC S9(5),并且会得到10位数的输出。为什么?好的,size你已经计算出来了,这个字段有四个字节长。但是,这应该会得到一个五位数的输出,范围在-99999到+99999之间。让我们暂时假设您的字段是COMP-5PIC S9(5)。
对于COMP-5,所有位都是有效的,并且对于有符号字段,完整字/字的范围是-2,147,483,648到+2,147,483,647。注意,这是10位数。与你在输出中得到的10位数字相匹配。发生了什么?
编译器选项TRUNC。如果使用编译器选项TRUNC(BIN),则所有的COMP/COMP-4/BINARY字段都被视为COMP-5。故事到此结束。你有TRUNC(BIN)由你,你的项目,或作为你的网站默认选择。这不一定是一个好的选择。
编译器选项TRUNC的其他值是STD,它对COMP/COMP-4/BINARY执行“正常”截断,以及OPT,它执行当时最好的(为了性能)。
需要注意的是,TRUNC(OPT)给程序员强加了一个契约。“我不会,一定不会,甚至永远不会考虑,允许COMP/COMP-4/BINARY字段的值与它的PICture不符。如果我这样做了,这都是我的错,句号,故事的结束,没有我的哭。”
不要仅仅启动和更改TRUNC设置,除非是为了调查事物是如何工作的。如果你这样做,你可能会打破一些东西,这可能是一个非常,非常微妙的中断。
我的建议: TRUNC(BIN),除非迫不得已(有人决定,你别无选择),否则不要使用它;如果你的网站害怕合同,就使用TRUNC(STD);如果你的网站对合同感到满意,就使用TRUNC(OPT)。
对于需要的各个字段定义,请使用COMP-5。你需要去哪里?对于任何位置,你都有一个二进制字段,它的范围超出了它的PICture的“十进制值”。例如,查看CICS COMMAREA的大小和指示单个示例有多大的字段。查看COBOL程序中的VARCHAR主机字段。与JAVA或C/C++通信的数据可能是这样的。否则,对于新的程序,首选二进制,这表明您是1985年的最新版本。
为调查目的设置TRUNC。
CBL TRUNC(STD)
ID (or IDENTIFICATION) DIVISION.编译器选项也可以由编译的JCL中的PARM语句设置,但您可能无权访问。CBL将覆盖PARM中设置的任何值。有一个安装选项可以防止使用CBL (也称为进程)。单个选项也可以在安装时进行“修复”。如果你的站点已经修复了TRUNC或者阻止了CBL,你将无法尝试这些东西。
发布于 2019-07-03 03:48:50
COMP usage子句将被称为BINARY或COMPUTATION。
COMP usage子句仅适用于数值数据类型。
COMP使用率是数据的二进制表示。
COMP变量中的数据以纯二进制格式存储在内存中。
COMP使用的内存分配如下所示。
Picture Number of Bytes
S9 to S9(4) 2
S9(5) to S9(9) 4
S9(9) to S9(18) 8https://stackoverflow.com/questions/42411671
复制相似问题