我有关于 COBOL 数据类型的疑惑。 比如在许多面试中,经常会被要求解释 COMP-3 和 COMP 之间的区别... 它们究竟有何不同? COBOL 的使用模式是什么意思?它与数据类型有什么关系?
我有关于 COBOL 数据类型的疑惑。 比如在许多面试中,经常会被要求解释 COMP-3 和 COMP 之间的区别... 它们究竟有何不同? COBOL 的使用模式是什么意思?它与数据类型有什么关系?
USAGE
在 COBOL 中用于描述数据项的使用方式。以下是一些 USAGE 的示例:
PIC 9(5) USAGE DISPLAY
描述了一个可以显示(打印)的五位数。通常如果没有指定,USAGE DISPLAY
会被隐含。有各种类型的数字项目。最常用的两个数字数据类型是:
COMP(BINARY)数据项通常是处理表示整数值的数据项的最有效方法。
COBOL 使用 COMP-3(PACKED-DECIMAL)数据项,因为它们保持固定的小数位数。所有计算都会产生一个具有预定小数点数的结果。这在会计类型的操作中特别有用。浮点数使小数点后的数字个数变量(例如,小数点可以“浮动”),这并不是通常表示财务操作的方式。
您可以在此处找到 IBM Enterprise COBOL 的 COMPutational 项的完整列表。
许多程序员在开始使用 COBOL 时遇到的问题之一是理解 COMP 项非常适合进行数学运算但不能显示(打印),直到通过转换为 DISPLAYable 项才能打印。
一个MOVE语句。如果你将一个COMP项目移动到报告或屏幕上,它的呈现效果不会很好。它需要先移动到DISPLAY项目中。另一件你可能想要更深入研究的事情是,在COBOL中定义变量时,PICture和USAGE之间的关系。这里有一个非常好的入门COBOL教程链接,来自Limerick大学。
COBOL实际上只有两种数据类型:数字和字符串。
每个COBOL记录中的字段布局都由一个“PICTURE”(通常缩写为“PIC”)子句精确指定。最常见的是:
数字字段可以有一个“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。
COMP
或 BINARY
是本地二进制格式,就像 C 中的 short
、int
或 long
一样。
为了澄清何时选择特定类型和数据项的用法。
任何字符数据都应使用适当大小的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”。