COBOL数据类型

21

我有关于 COBOL 数据类型的疑惑。 比如在许多面试中,经常会被要求解释 COMP-3 和 COMP 之间的区别... 它们究竟有何不同? COBOL 的使用模式是什么意思?它与数据类型有什么关系?

5个回答

21

USAGE 在 COBOL 中用于描述数据项的使用方式。以下是一些 USAGE 的示例:

  • DISPLAY。这标识了一个可以在终端或报表中打印的项目。它可能是数字也可能不是数字(例如,可能是文本值)。 DISPLAY 项的描述由 PICture 子句给出。例如:PIC 9(5) USAGE DISPLAY 描述了一个可以显示(打印)的五位数。通常如果没有指定,USAGE DISPLAY 会被隐含。
  • INDEX。这标识了一个用作表(OCCURS)索引的项目。
  • COMPsomething 表示该数据项将用于算术运算(即它是某种类型的数字)。

有各种类型的数字项目。最常用的两个数字数据类型是:

  • COMPUTATIONAL 或 COMP。这等同于 BINARY。
  • COMPUTATIONAL-3 或 COMP-3。这等同于 PACKED-DECIMAL。

COMP(BINARY)数据项通常是处理表示整数值的数据项的最有效方法。

COBOL 使用 COMP-3(PACKED-DECIMAL)数据项,因为它们保持固定的小数位数。所有计算都会产生一个具有预定小数点数的结果。这在会计类型的操作中特别有用。浮点数使小数点后的数字个数变量(例如,小数点可以“浮动”),这并不是通常表示财务操作的方式。

您可以在此处找到 IBM Enterprise COBOL 的 COMPutational 项的完整列表。

许多程序员在开始使用 COBOL 时遇到的问题之一是理解 COMP 项非常适合进行数学运算但不能显示(打印),直到通过转换为 DISPLAYable 项才能打印。

一个MOVE语句。如果你将一个COMP项目移动到报告或屏幕上,它的呈现效果不会很好。它需要先移动到DISPLAY项目中。

另一件你可能想要更深入研究的事情是,在COBOL中定义变量时,PICture和USAGE之间的关系。这里有一个非常好的入门COBOL教程链接,来自Limerick大学。


我们有多少种类型的COMP变量?我一直以为我们只有COMP和COMP3...其中COMP是二进制存储,而COMP 3是紧缩十进制存储。从回答我的问题中,我得知这些数据类型在存储方面存在差异,即存储数据所需的内存。那么什么是COMP-5? - Manasi
2
@Manasi 对于 IBM Enterprise COBOL,有 5 种不同的 COMPUTATIONAL 项目,分别是 COMP-1 到 COMP-5。我在原帖中提供了一个链接,描述了这些内容 - 你应该仔细阅读。请注意,某些计算类型具有多个名称(例如 COMP/BINARY 和 COMP-3/PACKED-DECIMAL)。每个 COBOL 供应商都支持类似的 COMP-x 项目集合(在处理舍入、精度和截断方面可能存在供应商差异)。一些供应商(例如 RM)提供了 COMP-6 项目。COMP-5 是一种本地二进制格式,具有 2、4 或 9 字节的存储空间。 - NealB
1
糟糕...最后一句应该是:2、4或8个字节的存储。 - NealB
1
那就是COMP和COMP-1到COMP-5。BINARY与COMP和COMP-4相同。PACKED-DECIMAL与COMP-3相同。由于COMP/COMP-4/BINARY相同,我们仍然有五个 :-) - Bill Woodger
RM COMP-6是无符号的COMP-3。我怀疑它们是为了与某些现有的COBOL兼容而加入的,而不是发明出来的。 - user207421
@EJP,比如一个只包含十进制值的“二进制”字段?是X'123456',而不是X'0123456F'?这就是二进制编码的十进制(BCD)。它部分地是一件“旧事物”(为了节省磁盘/磁带存储空间),部分地是一种仍在使用中的数据类型,需要注意。IBM主机没有“本地”的BCD,因此需要在需要时进行编码... - Bill Woodger

18

COBOL实际上只有两种数据类型:数字和字符串。

每个COBOL记录中的字段布局都由一个“PICTURE”(通常缩写为“PIC”)子句精确指定。最常见的是:

  • 用于字符串的“PIC X”。 “PIC X(100)”表示长度为100字节的字符串。
  • 用于数字的“PIC 9”,可选择带“S”(符号)或“V”(隐式小数点)。例如,“PIC S9(7)V99”表示带有7位数字左侧的带符号数字和2位数字右侧的隐式小数点。

数字字段可以有一个“USAGE”子句来优化它们的存储。最常见的“USAGE”是“DISPLAY”、“COMP”和“COMP-3”。

“DISPLAY”将每个数字存储为字符。例如,“PIC 9(4)VALUE 123”将数字存储为字符串“0123”。而“PIC 9(4)V99 VALUE 123.45”则将其存储为“012345”。请注意,实际上不会存储小数点。

这种格式效率低下,因为需要8位来表示每个数字。但是,它通过使用最后一个字节的一半来存储符号,对带符号数字进行了“优化”。通常,EBCDIC数字都具有高位的F,因此0123为F0 F1 F2 F3。但是,-0123为F0 F1 F2 D3;D表示负数,C表示正数,F表示无符号(即正数)。(在ASCII版本的COBOL中使用类似的格式,但不太规范。)

COMP-3 是带尾数符号的二进制编码的十进制。 PIC 9(3) COMP-3 VALUE 123 转换为两个字节 12 3F。

COMPBINARY 是本地二进制格式,就像 C 中的 shortintlong 一样。


感谢回答。我想了解决定不同场景适用的数据类型的因素,例如每种数据类型的内存消耗是不同的。COMP占据4个字节的内存,而COMP-3占据(数字/2)+1个字节。 - Manasi
COMP使用最小的数据类型来保存所有数字,但通常它必须是2的幂。因此,如果有16位、32位和64位类型可用,则1-4位数字占用2个字节,5-9位数字占用4个字节,10-18位数字占用8个字节。这使得对于具有1、5或10-13个数字的字段,COMP-3是最优选择。 - dan04
关于决定使用哪种数据类型,我不知道。我实际上并不编写COBOL。我是一名C++程序员,不得不学习阅读COBOL布局,以便将数据传递给我们的大型机上的程序。 - dan04
1
真想给负一分,因为忽略了除数字和字符串之外的所有Cobol数据类型 -- 对象?日期?指针?文件(在某些变体中)? - Joe Zitzelberger
Cobol没有“strngs”,即没有带有某种描述数据结尾标记的字段。Cobol具有固定长度字段和可变长度字段(其中长度在数据外部保持)。对于dan04的评论,由于他不了解Cobol,因此忘记“最佳”的说法... - Bill Woodger

4
关于决定使用哪种数据类型,可能会变得非常复杂 - 但是 - 以下是一组简单的准则:
DISPLAY和Edited Zone Decimal仅应用于在报告或sysout中显示数字。在将其放入报告或sysout之前,请将COMP和COMP-3字段移动到DISPLAY/Edited字段中。
COMP - 对于整数具有最快的计算速度
COMP-3(PACKED Decimal)- 应在需要保持小数位数时使用。
COMP和COMP-3字段可以在计算中一起使用。编译器将确定哪种字段类型将被转换(在内部)为单个通用数字数据类型 - 基于规则。

2
正如其他回复所建议的,COMP表示大端二进制。COMP-3是打包十进制——这意味着一个小数位映射到每个半字节。
尽管如此,我不确定以前的回复是否正确理解了有关精度的问题。
PIC S9(9)V9(9)COMP 和 PIC S9(9)V9(9)COMP-3
具有完全相同的精度。这是ANSI85标准的一部分。编译器和运行时的工作是确保在COMP中的二进制表示具有适当的转换,以确保实现与使用display或COMP-3相同的结果。
IBM大型机计算机具有硬件打包十进制计算。这非常有帮助,因为十进制到二进制的转换随n平方缩放,其中n是数字的长度。这意味着,在大型机上,COMP-3通常是最快的格式,但在分布式系统上可能性较小。但是,这也并非总是这种情况。例如,Micro Focus本地COBOL解决方案对于非常大的十进制精度(> 18位数)来说,COMP-3往往比COMP-5更快,但在其他情况下则相反。 Micro Focus的Managed COBOL系统在COMP方面几乎总是最快的(实际上,COMP-5是最好的-它类似于COMP,但将具有硬件字节序而不是强制大端存储器布局)。
最后,我建议对于中间值和一般数学,更新的二进制长和二进制双精度数据定义是更好的选择,因为编译器可以为您做出存储和优化决策。
有关分布式和Managed COBOL的更多信息,请查看此knol:http://knol.google.com/k/alex-turner/micro-focus-managed-cobol/2246polgkyjfl/4,也可以在Facebook上搜索cobol :)

您应该被警告,COBOL编译器在处理二进制数据类型的精度时存在差异,尤其是在截断发生时。理解复杂计算中间结果的管理方式也是一个相当复杂的主题。例如,参见Intermediate Results以了解它们如何适用于IBM企业级COBOL。 - NealB
+1 如果提到 IBM 的主机计算机在硬件上有压缩十进制计算。压缩十进制最初是 IBM 对 Cobol 的增强。 - Gilbert Le Blanc
对于COMP-3和COMP-5,不应该有任何差异,因为它们的中间结果在标准中已经定义。然而,不同的编译器供应商确实有自己的扩展。但是,COMP-1和COMP-3的定义比较模糊。 - alex turner
1
同意对于COMP-3和COMP-5,但要注意COMP/BINARY项目,因为至少对于IBM Enterprise COBOL而言,TRUNC(BIN/OPT/STD)编译器选项会影响截断的管理方式。 - NealB

0

为了澄清何时选择特定类型和数据项的用法。

任何字符数据都应使用适当大小的PIC X(n)字符串。较短的字符串将用尾随空格填充。

很少用于计算但经常显示数字(例如AGE,ZIPCODE,CUSTOMER_NUMBER),则使用PIC 9(n) USAGE DISPLAY。

用于计算的整数(例如QTY_AVAILABLE)则使用PIC S9(4) COMP。在大多数平台上,S9(4)是一个smallint,而S9(8)是一个32位整数。

用于计算货币价值(例如PRICE,DELIVERY_COST,TAX)则使用PIC S9(4)V99 COMP或COMP-3。这将启用正确舍入的会计计算。

如果平台是IBM主机或类似设备,则选择COMP-3具有硬件支持,否则COMP更有效率。

请注意,要在屏幕或报告上显示COMP值,必须首先将其移动到DISPLAY类型的项目中,因此“PIC S9(4)V99 COMP”应移动到“PIC ---9.99 DISPLAY”项目中以使其可读性更强。这将显示数字为“12.45”和“-123.45”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接