COBOL数据类型

COBOL Data types

我对COBOL数据类型感到困惑。
像在许多采访中一样,要求解释COMP-3和COMP ...之间的区别。
确切的区别是什么?
COBOL中使用模式的含义是什么,它与数据类型有何关系?

谢谢并恭祝安康,
玛纳斯·库尔卡尼(Manasi Kulkarni)


COBOL中的USAGE描述了如何使用数据项。一些例子
的用法有:

  • 显示。这标识可以在终端上打印的项目或
    报告。这可以是数字,也可以不是数字(例如,可以是文本值)。的
    PICture子句给出了DISPLAY项目的描述。例如:
    PIC 9(5) USAGE DISPLAY描述可能显示(打印)的5位数字。
    通常会忽略USAGE DISPLAY,因为如果缺少它则意味着它。
  • 指数。这标识用作表(OCCURS)索引的项目。
  • COMPsomething表示该数据项将用于
    算术运算(即它是某种类型的数字)。

有多种类型的数字项目。最常用的两种
数字数据类型为:

  • 计算或COMP。这等效于BINARY
  • COMPUTATIONAL-3或COMP-3。这等效于PACKED-DECIMAL

COMP(BINARY)数据项通常是执行的最有效方法
对代表整数值的数据项进行计算。

在COBOL中使用COMP-3(PACKED-DECIMAL)数据项是因为
它们保持固定数量的小数点。所有计算
导致结果具有指定的小数位数。
这在记帐类型操作中特别有用。
浮点数表示数字后的位数
小数点变量(例如,小数点可以"浮动")是
而不是通常以财务运作方式来表示。

您可以找到IBM Enterprise COBOL的计算项目的完整列表
这里

许多程序员从COBOL开始时遇到的问题之一是
了解COMP项非常适合进行数学运算,但不能
显示(打印),直到通过以下方式将其转换为"可显示"项目
MOVE语句。如果将COMP项移动到报告中或
屏幕上不会显示的很好。需要将其移至DISPLAY
项目第一。

您可能需要研究的另一件事是
定义变量时图片与使用之间的关系
在COBOL中。这是一个非常好的COBOL入门教程的链接
来自利默里克大学。


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

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

  • PIC X用于字符串。 PIC X(100)表示一个100字节的字符串。
  • PIC 9用于数字,可以选择使用S(符号)或V(隐式小数点)。例如,PIC S9(7)V99表示带符号的数字,该数字在隐式小数点左边为7位,在右边为2位。

数字字段可以具有USAGE子句以优化其存储。最常见的USAGEDISPLAYCOMPCOMP-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表示无符号(即正数)。 (在COBOL的ASCII版本中使用了类似的格式,但没有标准化。)

COMP-3是二进制编码的十进制,后缀为nybble。 PIC 9(3) COMP-3 VALUE 123变为两个字节12 3F。

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


至于决定使用哪种数据类型,可以使其非常复杂-但是-一组简单的准则是:

DISPLAY和Edited Zone Decimal应该仅用于在报表或sysout中显示数字。将COMP和COMP-3字段移到"显示/编辑"字段中,然后再将其放入报表或sysout中。

COMP-具有最快的整数计算速度

COMP-3(打包的十进制)-应在保留十进制位置时使用。

COMP和COMP-3字段可以在计算中一起使用。编译器将确定哪种字段类型(在幕后)将转换为单个通用数字数据类型-基于规则。


正如其他答复所暗示的那样,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通常是大型机中最快的格式,但是不太可能出现在分布式系统上。但是,情况并非总是如此。例如,对于非常大的十进制精度(> 18位),Micro Focus原生COBOL解决方案在COMP-3中趋向于比COMP-5更快,反之则相反。 Micro Focus的Managed COBOL系统在COMP中几乎总是最快的(实际上,COMP-5是最好的-与COMP类似,但是将具有硬件字节序,而不是强制使用大字节序内存布局)。

最后,我建议对于中间值和通用数学,binary-long和binary-double的较新数据定义是更好的选择,因为这样编译器就可以决定如何为您存储和优化。

有关分布式和托管COBOL上的COBOL的更多信息,请查看以下知识库:http://knol.google.com/k/alex-turner/micro-focus-managed-cobol/2246polgkyjfl/4,并且随时可以在以下位置查找cobol脸书:)