(一)字符数据在内存中的存储形式
字符型、字母型和数值编辑型、字符编辑型数据项中的数据,每一个字符都在内存中占一个字节。这种形式称为标准数据形式。
由于内存中数据都是以二进制数来表示的,因此要规定每一个字符用怎样的一组二进制数来表示。每类计算机系统分别选择其所用的代码形式。(ASCII, EBCDIC)
如果采用字符型数据形式,不论是字母或数字,都按一个字节存放一个字符。
(二)数值型数据在内存中的存储形式
1.外部十进制(扩张十进制)形式
按数值在机器外部的表现形式,一个数字在内存中占一个字节。每一个数字与二进制代码的关系同上。
77 C PIC 9(3) VALUE 486.
11110100 11111000 11110110
4 8 6
为表示方便,有时用十六进制数来表示一个数。
因此上面的数也可表示为:
F4 F8 F6
如果为一个负数。
77 D PIC S9(3) VALUE -486.
11110100 11111000 11010110
4 8 6
此时,负号不占一个字节,而在最后一个字节中放入某个信息,一般是将此字节的前四位1111改为1101,后四位不边。
计算机检查最后一个字节的前四位,如果是1101,则按负数处理。如果是1100,则按正数处理。或者说,用十六进制中”C” (1100)代表正,“D”(1101)”代表负,F”(1111)代表无符号,即绝对值。(也有些计算机系统不用CD而用其他数代表正负)
2.外部浮点数形式
某些数据,它的值很大或很小,用以前讲的外部十进制形式存储是有困难的。COBOL允许用指数形式来表示一个数。
+1.23876E+59(+1.23876×1059)
-1.38457E-69(-1.38457×10-69)
其中E表示以10为底的指数。E前面的部分成为“数值部分”或“尾数部分”。E后面的是“指数部分”或“阶码部分”。数值部分和指数部分各有一个符号以表示正或负。
其一般形式为:
数符数值部分 E 阶码符阶码
为了表示这种指数形式的数据(外部浮点形式),在PIC字句中可以这样写:
77 A PIC +9.99999E+99
或77 B PIC -9V99999E-99
它表示在内存中按以上形式存放数据。其中每一个“9”表示此位置可放入一个0-9之间的数字,一个9占一字节。E前面放数值部分,E后面放指数部分。小数点“.”表示此位置有一个小数点,“V”表示此位置有一隐含的小数点,它不占内存字节。正号“+”的意思是,如果数值为正,此处为正号,数值为负时,此处为负号。负号“-”的意思是:数值为正时此处空白,数值为负时,此处为负号(它们的用法和数值编辑项中的“+”、“-”编辑符相同)。E也占一个字节。因此A 占12个字节,B占11个字节。
在多数COBOL版本中浮点数可以表示的数的范围是5.4×1079到0.72×1076。用外部
浮点形式,PIC字符串中数值部分最多可以出现16个9,指数部分除E外,应有一个+或-,以及两个9(不应该有三个或更多个9,因为不可能出现10 100以上的数值)对外部浮点项不能用VALUE子句赋初值,如下面写法是不对的:
02 N PIC +99.99E+99 VALUE +12.45E+45
只能从外部文件上读入以指数形式表示的数据,也可以用MOVE语句给N传送数值。
PIC字符串外部数据格式表示的值
+99V9E-99 ︼183E-13 +18.3×10-13
-9V99E+99 ︼687E+65 +6.87×1065
+9(3).99E+99 +875.46E-12 +875.46×10-12
V9(6)E+99 ︼678123E+37 +0.678123×1037
+.99E-99 +.87E︼62 +0.87×1062
3.内部十进制(又称缩合十进制)形式
外部十进制形式在内存中一个字节放一个字符。数值型数据只用到0-9十个数字。因此在数值型数据的前提下,为表示0-9,前四位并不起辨别作用,只是根据后四位的不同来判别是0-9中的哪个数字。因此,为节省内存,可以只用四位二进制数字来代表一个十进制数。在一个字节中放两个十进制数字。每个数字占四个二进位,即半个字节。符号也占半个字节。如-14932在内存中为
0001 0100 1001 0011 0010 1101
1 4 9 3
2 -
或用十六进制表示
14932D
+43856在内存中为:
0100 0011 1000 0101 0110 1100
或43856C
无符号的数3856,在内存中为:
0000 0011 1000 0101 0110 1111
或03856F
F表示数值无符号,即取绝对值。由于存取的最小单位是字节,因此3856虽然只需两个半字节,但也占三个字节,最前面半个字节补零。
4.定点二进制形式
不是以一个数字对应一个字节或半个字节,而是先把十进制数化成定点二进制数形式,然后存放在内存中。COBOL规定在内存中根据数据项的长度分别用二字节,四字节或八字节来存放一个以定点二进制
形式存放的数。
在PIC子句中描述字符9的个数占内存字节
1-4 2
5-9 4
10-18 8
十进制数83212用二进制形式表示为10100010100001100,由于用PIC9(5)在内存中占四个字节,存放形式为:
00000000 0000000101000101 00001100
因为2个字节放不下十进制中所有的5位整数(2个字节存放数的范围为-32767~32768),所以系统规定5位以上整数用4个字节存放。同样,4个字节放不下所有的10位整数,故规定10位以上的整数一律以8个字节存放。
5.内部浮点形式
它以内部的指数形式(二进制的指数形式)来表示一个数,以固定长度的内存单元来存放一个数。
短浮点形式:以4个字节(32位)表示一个数,其中8位表示指数部分,24位表示数字部分。
长浮点形式:以8个字节(64位)表示一个数,指数部分仍为8位,数字部分为56位。
长浮点形式比短浮点形式有更高的精确度。内部浮点形式的数值在内存中所占字节长度只有4个字节和8个字节两种。
无论短浮点形式或长浮点形式,所表示的数值范围均为:5.4×10-79~0.72×1076
(三)数据描述与存储形式的关系
1.字母型、字符型、编辑型、外部十进制数据和以外部浮点形式表示的数据用标准数据形
式来存放,即一个字符占一个字节。
如:77 A PIC X(6).
77 B PIC A(6).
77 C PIC 999.99.
均占6个字节。
2.数值型数据可以由程序员任意选定存放形式(外部十进制、外部浮点形式、内部十进制、
定点二进制、内部浮点形式)。用外部十进制形式最简单、最好理解,但一般说,它占内存多。如135879326九位数,用外部十进制需9个字节,用内部十进制需5个字节,用定点二进制需4个字节,短浮点形式需4个字节,长浮点形式需8个字节。
3.数据在计算机内进行运算,都是化成二进制数以后再进行的,因此,外部十进制形式是
不能直接进行运算的,需要由计算机把它们先化为定点二进制或内部浮点形式,然后再进行运算。显然,花时间多,速度慢。
从运算速度上看,定点形式最快,内部浮点形式次之,外部浮点形式和外部十进制、内部十进制最慢。因此,用户应根据需要选择用哪一种数据形式。这就要用USAGE子句。
USAGE子句
使用USAGE子句可以使程序设计者自由选择数据在内存中的存放形式。譬如,有数据A和B,需要多次对它们进行运算,如果用外部十进制形式则来回转换会大大降低运算速度,这时,可以选择A和B为定点
二进制形式或内部浮点形式。如果数据项C和D参加运算次数少,而且需要多次打印出C和D的结果,这时用外部比较适合,因为它最适合打印的要求,不必再进行转换。
USAGE子句的一般格式为:
[USAGE IS] DISPLAY
COMPUTATIONAL
COM
其中USAGE IS DISPLAY的意思是“显示型的用法”,即:此数据项适于显示、打印,它采用标准数据形式(一个字节放一个字符)。
COMPUTATIONAL和COMP是同一意思(COMP是COMPUTATIIONAL的缩写)。的意思是“计算
型的用法”(它只能用于数值型数据项)。表示此数据形式适于计算,它采用适于计算用的定点二进制形式或内部浮点形式。
DISPLAY 标准数据形式,一个字节放一个字符
COMP 定点二进制形式字符串截取前四位
COMP-1 内部短浮点形式
COMP-2 内部长浮点形式
COMP-3 内部十进制形式
说明:
1.USAGE子句是用来指定数据项在内存中的存储形式的。USAGE IS 这两个词可以省略。
2.如果省略USAGE子句,则默认为DISPLAY形式。
字符型、字母型、编辑型、外部十进制、外部浮点形式的数据项必须用USAGE DISPLAY。
3.如果对组合项描述为某一种存储形式,则表示这个组合项的下属各初等项都是这种形
式。组合项的描述中如果用了USAGE子句,其下属的初等项可以再用USAGE子句,但二者的说明不应矛盾。
4.USAGE子句指定的数据存储形式不应与PIC子句指定的数据类型矛盾。
5.长、短浮点形式已确定了内存的长度,不应再用PIC子句。
如:04 A COMP-2
6.在传送或运算时不同存储形式的数值型数据间可互相转换。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论