【问题标题】:COBOL Data typesCOBOL 数据类型
【发布时间】:2010-06-08 09:53:07
【问题描述】:

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

【问题讨论】:

    标签: cobol


    【解决方案1】:

    COBOL 中的USAGE 描述了如何使用数据项。几个例子 的用法是:

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

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

    • COMPUTATIONAL 或 COMP。这相当于 BINARY
    • COMPUTATIONAL-3 或 COMP-3。这相当于 PACKED-DECIMAL

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

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

    您可以找到 IBM Enterprise COBOL 的 COMPutational 项的完整列表 here

    许多程序员在开始使用 COBOL 时遇到的问题之一是 了解 COMP 项目非常适合做数学,但不能 显示(打印),直到通过 MOVE 语句。如果您将 COMP 项目移动到报表或 屏幕它不会呈现得很好。它需要移动到 DISPLAY 首先是项目。

    您可能想要进一步研究的另一件事是 定义变量时 PICture 和 USAGE 之间的关系 在 COBOL 中。这是一个非常好的介绍性COBOL Tutorial的链接 来自利默里克大学。

    【讨论】:

    • 我们有多少 COMP 类型的变量?我的印象是我们只有 COMP 和 COMP3 ......其中 COMP 是二进制存储,COMP 3 是压缩十进制存储。从对我的问题的答复中,我了解到这些数据类型的存储空间不同,即存储数据所需的内存。什么是 COMP-5?
    • @Manasi 对于 IBM Enterprise COBOL,有 5 个不同的 COMPUTATIONAL 项,COMP-1 到 COMP-5。我在原始帖子中提供了一个指向 IBM 手册的链接,其中描述了这些内容——您应该查看它。请注意,某些计算类型有多个名称(例如 COMP/BINARY 和 COMP-3/PACKED-DECIMAL)。每个 COBOL 供应商都支持一组相似的 COMP-x 项(在处理舍入、精度和截断的方式上可能存在供应商差异)。一些供应商(例如 RM)提供了 COMP-6 项目。 COMP-5 是一种原生二进制格式,具有 2、4 或 9 个字节的存储空间。
    • 哎呀...最后一句应该是:2、4 或 8 字节的存储空间。
    • 那就是 COMP 和 COMP-1 到 COMP-5。 BINARY 与 COMP 和 COMP-4 相同。 PACKED-DECIMAL 与 COMP-3 相同。由于 COMP/COMP-4/BINARY 相同,我们还有五个 :-)
    • RM COMP-6 是未签名的 COMP-3。我怀疑他们发明了它:它本来是为了与一些现有的 COBOL 兼容。
    【解决方案2】:

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

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

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

    数字字段可以有一个USAGE 子句来优化它们的存储。最常见的USAGEs 是DISPLAYCOMPCOMP-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

    【讨论】:

    • 感谢您的回答。我想知道决定适合不同场景的数据类型的因素。就像每种数据类型的内存消耗不同。我猜 COMP 将占用 4 个字节的内存,而 COMP-3 占用 (digits/2)+1 个字节。
    • COMP 使用可以容纳所有数字的最小数据类型,但通常它必须是 2 的幂。因此,如果 16 位、32 位和 64 位类型可用,则 1-4 位占用 2 个字节,5-9 位占用 4 个字节,10-18 位占用 8 个字节。这使得 COMP-3 最适合 1、5 或 10-13 位数字的字段。
    • 至于决定使用哪种数据类型,我不知道。我实际上并没有编写 COBOL。我是一名 C++ 程序员,他必须学习阅读 COBOL 布局才能将数据传递给我们大型机上的程序。
    • 试图给出 -1 以省略除数字和字符串之外的所有其他 Cobol 数据类型——对象?日期?指针?文件(在某些变体中)?
    • Cobol 没有“字符串”,就像在带有某些描述的数据结束标记的字段中一样。 Cobol 具有固定长度字段和可变长度字段(其中长度保存在数据的外部)。对于 dan04 的评论,由于他不了解 Cobol,所以忘记了“最适合”...
    【解决方案3】:

    至于决定使用哪种数据类型,可能会非常复杂 - 但是 - 一组简单的指导方针是:

    DISPLAY 和 Edited Zone Decimal 只能用于在报告或系统输出中显示数字。将 COMP 和 COMP-3 字段移动到 DISPLAY/Edited 字段,然后再将其放入报告或 sysout。

    COMP - 整数

    的计算速度最快

    COMP-3 (PACKED Decimal) - 当小数位应保持时应使用。

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

    【讨论】:

      【解决方案4】:

      正如其他回复所暗示的,COMP 表示大端二进制。 COMP-3 是压缩十进制 - 这意味着一个十进制数字映射到每个半字节。

      我不确定之前的回复是否解决了精度问题。

      PIC S9(9)V9(9) COMP 和 PIC S9(9)V9(9) COMP-3

      具有完全相同的精度。这是 ANSI85 标准的一部分。编译器和运行时的工作是确保 COMP 中的二进制表示具有适当的转换,以确保完全获得与使用显示或 COMP 时相同的结果3.

      IBM 大型计算机在硬件中封装了十进制计算。这非常有用,因为十进制到二进制的转换为 n 的平方 n 是数字的长度。这意味着 COMP-3 通常是最快的大型机格式,但不太可能出现在分布式系统上。然而,情况并非总是如此。例如,对于非常大的十进制精度(>18 位),Micro Focus 原生 COBOL 解决方案在 COMP-3 中往往比 COMP-5 更快,但在其他情况下则相反。 Micro Focus 的 Managed COBOL 系统在 COMP 中几乎总是最快的(实际上,COMP-5 是最好的 - 它与 COMP 类似,但将具有硬件字节序而不是强制大字节序内存布局)。

      最后,我建议对于中间值和一般数学,二进制长和二进制双精度的较新数据定义是更好的选择,因为这样编译器可以为您决定如何存储和优化。

      有关分布式和托管 COBOL 的更多信息,请查看此 knol:http://knol.google.com/k/alex-turner/micro-focus-managed-cobol/2246polgkyjfl/4 并随时在 facebook 上查找 cobol :)

      【讨论】:

      • 应该警告您,COBOL 编译器在处理二进制数据类型的精度方面存在差异,尤其是在发生截断时。了解如何管理复杂计算中的中间结果也是一个相当复杂的主题。例如,请参阅 Intermediate Results,因为它们适用于 IBM Enterprise COBOL。
      • +1 提到 IBM 大型计算机在硬件中包含十进制计算。压缩十进制最初是 IBM 对 Cobol 的增强。
      • 对于 COMP-3 COMP 和 COMP-5 不应有任何差异,因为标准中定义了中间结果。但是,不同的编译器供应商确实有自己的扩展。不过 COMP-1 和 COMP-3 的定义并不明确。
      • 同意 COMP-3 和 COMP-5,但要注意 COMP/BINARY 项,因为至少对于 IBM Enterprise COBOL,TRUNC(BIN/OPT/STD) 编译器选项会影响截断的管理方式.
      【解决方案5】:

      阐明何时为数据项选择特定类型和用途。

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

      在计算中很少使用但经常显示的数字(例如 AGE、ZIPCODE、CUSTOMER_NUMBER)然后是 PIC 9(n) USAGE DISPLAY。

      用于计算计算中使用的事物的整数(例如 QTY_AVAILABLE) THEN 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”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-24
        • 1970-01-01
        • 2019-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多