【发布时间】:2010-06-08 09:53:07
【问题描述】:
我对 COBOL 数据类型感到困惑。 就像在许多采访中一样,它被要求解释 COMP-3 和 COMP 之间的区别...... 确切的区别是什么? COBOL中的使用模式是什么意思,和数据类型有什么关系?
【问题讨论】:
标签: cobol
我对 COBOL 数据类型感到困惑。 就像在许多采访中一样,它被要求解释 COMP-3 和 COMP 之间的区别...... 确切的区别是什么? COBOL中的使用模式是什么意思,和数据类型有什么关系?
【问题讨论】:
标签: cobol
COBOL 中的USAGE 描述了如何使用数据项。几个例子
的用法是:
PIC 9(5) USAGE DISPLAY 描述了一个可以显示(打印)的 5 位数字。
USAGE DISPLAY 通常会被省略,因为如果缺少它是隐含的。有各种类型的数字项目。最常用的两种 数值数据类型有:
COMP (BINARY) 数据项通常是最有效的执行方式 对表示整数值的数据项进行计算。
COMP-3 (PACKED-DECIMAL) 数据项在 COBOL 中使用,因为 它们保持固定数量的小数点。所有计算 导致具有规定的小数位数的结果。 这在会计类型的操作中特别有用。 浮点数使后面的位数 小数点变量(例如小数点可以“浮动”),即 不是通常表示财务操作的方式。
您可以找到 IBM Enterprise COBOL 的 COMPutational 项的完整列表 here
许多程序员在开始使用 COBOL 时遇到的问题之一是 了解 COMP 项目非常适合做数学,但不能 显示(打印),直到通过 MOVE 语句。如果您将 COMP 项目移动到报表或 屏幕它不会呈现得很好。它需要移动到 DISPLAY 首先是项目。
您可能想要进一步研究的另一件事是 定义变量时 PICture 和 USAGE 之间的关系 在 COBOL 中。这是一个非常好的介绍性COBOL Tutorial的链接 来自利默里克大学。
【讨论】:
COBOL 实际上只有两种数据类型:数字和字符串。
COBOL 记录中每个字段的布局由PICTURE(通常缩写为PIC)子句精确指定。最常见的是:
PIC X 用于字符串。 PIC X(100) 表示一个 100 字节的字符串。PIC 9 用于数字,可选择使用S(符号)或V(隐式小数点)。例如,PIC S9(7)V99 表示带符号的数字,隐式小数点左侧为 7 位,右侧为 2 位。数字字段可以有一个USAGE 子句来优化它们的存储。最常见的USAGEs 是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 表示无符号(即正数)。 (在 COBOL 的 ASCII 版本中使用了类似的格式,但没有标准化。)
COMP-3 是二进制编码的十进制,带有尾随符号 nybble。 PIC 9(3) COMP-3 VALUE 123 变成两个字节 12 3F。
COMP 或 BINARY 是原生二进制格式,就像 C 语言中的 short、int 或 long。
【讨论】:
至于决定使用哪种数据类型,可能会非常复杂 - 但是 - 一组简单的指导方针是:
DISPLAY 和 Edited Zone Decimal 只能用于在报告或系统输出中显示数字。将 COMP 和 COMP-3 字段移动到 DISPLAY/Edited 字段,然后再将其放入报告或 sysout。
COMP - 整数
的计算速度最快COMP-3 (PACKED Decimal) - 当小数位应保持时应使用。
COMP 和 COMP-3 字段可以在计算中一起使用。编译器将确定哪个字段类型将被转换(在幕后)为单个常见的数字数据类型 - 基于规则。
【讨论】:
正如其他回复所暗示的,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 :)
【讨论】:
阐明何时为数据项选择特定类型和用途。
任何字符数据然后 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”。
【讨论】: