<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Jackson Shawn&#039;s Blog &#187; K歌之后</title>
	<atom:link href="http://www.bigbigben.cn/tag/k%e6%ad%8c%e4%b9%8b%e5%90%8e/feed" rel="self" type="application/rss+xml" />
	<link>http://www.bigbigben.cn</link>
	<description>Thinking is always on</description>
	<lastBuildDate>Fri, 20 Jan 2012 16:41:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>K歌之后</title>
		<link>http://www.bigbigben.cn/surfing-the-internet/mainframe-profession/summary-after-ktv.html</link>
		<comments>http://www.bigbigben.cn/surfing-the-internet/mainframe-profession/summary-after-ktv.html#comments</comments>
		<pubDate>Sat, 22 May 2010 18:54:18 +0000</pubDate>
		<dc:creator>benbendemo</dc:creator>
				<category><![CDATA[玩转Mainframe]]></category>
		<category><![CDATA[K歌之后]]></category>

		<guid isPermaLink="false">http://bigbigben.cn/?p=20</guid>
		<description><![CDATA[庆祝上午论文答辩结束，晚上喊了一行人出去K歌。回来之后大脑就一直处于兴奋状态了，躺在床上满脑子都在回响着《天高地厚》这一首歌，不管我是如何 地使劲想睡也还是睡不着，试了下“数羊子”的方法，依然于事无补，索性起来写点东西，正好把论文中关于COBOL程序里面数值型数据存储形式这一块东西拿 出来做一个总结，更新上博客，方便日后查阅。 论文第四章的2.1小节针对数值型（Numeric）数据在内存中的几种存储形式进行了分析比较，这里写出来的东西就是分析比较之后得出来的结果，也是我所认为毕业论文里面最精华的一块地方。 4.2.1&#8212;&#8212;数值型（Numeric）在内存中的5种存储形式 数值型数据使用9型描述符，一个描述符只允许存储0-9当中的一个数字。数值型数据是COBOL程序中使用得最多的一种数据类型，数值型数据在内存中有5种存储形式，一般用USAGE子句来指定数据项在内存中的存储形式，但是USAGE子句通常可以省略，省略USAGE的条件下默认存储形式为Display类型，它表示该数值型数据在内存中以外部十进制形式存储。 （1）Display：外部十进制形式。表示数值在机器外部的表现形式，一个数字在内存中占一个字节。直接用9型描述符标识， Display关键字可以省略。 （2）COMP：定点二进制形式。这种存储形式不是将一个数字对应一个字节或者半个字节，而是先把十进制数转化成二进制数形式然后在内存中存储。因为机器存储的形式也是二进制，所以采用定点二进制存储形式的数据读取时速度最快的。COMP型数据经常用来做数学计算。COBOL规定在内存中根据数据项的长度分别用两个字节、四个字节或八个字节来存放定点二进制形式的数值。见表1。 表1   COMP型数据项长度与内存字节对应关系 PIC子句中 描述符&#8217;9&#8242;的个数 占内存空间大小 1-4 2Byte 5-9 4Byte 10-18 8Byte （3）COMP-1、COMP-2：内部浮点数形式。以内部的二进制指数形式来表示一个数，以固定长度的内存单元来存放一个数字。 COMP-1：单精度内部浮点数，默认为4个Byte。4个Byte表示一个数字，8位为指数部分、24位为数字部分。 COMP-2：双精度内部浮点数，默认为8个Byte。8个Byte表示一个数字，16位为指数部分、48位为数字部分。 注意：COMP-1和COMP-2只能使用USAGE子句进行定义，因为长度确定，不能用PIC描述符。 （4）COMP-3：内部压缩十进制。外部十进制形式一个数字在内存中占一个字节。数值型数据只用到0到9十个数字，从表2可以看出，0到9十个数字的代码前四位是相同的，见表2。 表2   外部十进制数EBCDIC编码 十进制数字 EBCDIC码 ASCII码 0 11110000 00110000 1 11110001 00110001 2 11110010 00110010 3 11110011 00110011 4 11110100 00110100 5 11110101 00110101 6 11110110 00110110 7 11110111 [...]]]></description>
			<content:encoded><![CDATA[<p>庆祝上午论文答辩结束，晚上喊了一行人出去K歌。回来之后大脑就一直处于兴奋状态了，躺在床上满脑子都在回响着《天高地厚》这一首歌，不管我是如何 地使劲想睡也还是睡不着，试了下“数羊子”的方法，依然于事无补，索性起来写点东西，正好把论文中关于COBOL程序里面数值型数据存储形式这一块东西拿 出来做一个总结，更新上博客，方便日后查阅。</p>
<p>论文第四章的2.1小节针对数值型（Numeric）数据在内存中的几种存储形式进行了分析比较，这里写出来的东西就是分析比较之后得出来的结果，也是我所认为毕业论文里面最精华的一块地方。</p>
<p>4.2.1&#8212;&#8212;数值型（Numeric）在内存中的5种存储形式</p>
<p>数值型数据使用9型描述符，一个描述符只允许存储0-9当中的一个数字。数值型数据是COBOL程序中使用得最多的一种数据类型，数值型数据在内存中有5种存储形式，一般用USAGE子句来指定数据项在内存中的存储形式，但是USAGE子句通常可以省略，省略USAGE的条件下默认存储形式为Display类型，它表示该数值型数据在内存中以外部十进制形式存储。</p>
<p>（1）Display：外部十进制形式。表示数值在机器外部的表现形式，一个数字在内存中占一个字节。直接用9型描述符标识， Display关键字可以省略。</p>
<p>（2）COMP：定点二进制形式。这种存储形式不是将一个数字对应一个字节或者半个字节，而是先把十进制数转化成二进制数形式然后在内存中存储。因为机器存储的形式也是二进制，所以采用定点二进制存储形式的数据读取时速度最快的。COMP型数据经常用来做数学计算。COBOL规定在内存中根据数据项的长度分别用两个字节、四个字节或八个字节来存放定点二进制形式的数值。见表1。</p>
<p>表1   COMP型数据项长度与内存字节对应关系</p>
<table border="1" cellspacing="0" cellpadding="0" align="left">
<tbody>
<tr>
<td width="238" valign="top">PIC子句中 描述符&#8217;9&#8242;的个数</td>
<td width="238" valign="top">占内存空间大小</td>
</tr>
<tr>
<td width="238" valign="top">1-4</td>
<td width="238" valign="top">2Byte</td>
</tr>
<tr>
<td width="238" valign="top">5-9</td>
<td width="238" valign="top">4Byte</td>
</tr>
<tr>
<td width="238" valign="top">10-18</td>
<td width="238" valign="top">8Byte</td>
</tr>
</tbody>
</table>
<p>（3）COMP-1、COMP-2：内部浮点数形式。以内部的二进制指数形式来表示一个数，以固定长度的内存单元来存放一个数字。</p>
<p>COMP-1：单精度内部浮点数，默认为4个Byte。4个Byte表示一个数字，8位为指数部分、24位为数字部分。</p>
<p>COMP-2：双精度内部浮点数，默认为8个Byte。8个Byte表示一个数字，16位为指数部分、48位为数字部分。</p>
<p>注意：COMP-1和COMP-2只能使用USAGE子句进行定义，因为长度确定，不能用PIC描述符。</p>
<p>（4）COMP-3：内部压缩十进制。外部十进制形式一个数字在内存中占一个字节。数值型数据只用到0到9十个数字，从表2可以看出，0到9十个数字的代码前四位是相同的，见表2。</p>
<p>表2   外部十进制数EBCDIC编码</p>
<table border="1" cellspacing="0" cellpadding="0" align="left">
<tbody>
<tr>
<td width="213" valign="top">十进制数字</td>
<td width="213" valign="top">EBCDIC码</td>
<td width="213" valign="top">ASCII码</td>
</tr>
<tr>
<td width="213" valign="top">0</td>
<td width="213" valign="top">11110000</td>
<td width="213" valign="top">00110000</td>
</tr>
<tr>
<td width="213" valign="top">1</td>
<td width="213" valign="top">11110001</td>
<td width="213" valign="top">00110001</td>
</tr>
<tr>
<td width="213" valign="top">2</td>
<td width="213" valign="top">11110010</td>
<td width="213" valign="top">00110010</td>
</tr>
<tr>
<td width="213" valign="top">3</td>
<td width="213" valign="top">11110011</td>
<td width="213" valign="top">00110011</td>
</tr>
<tr>
<td width="213" valign="top">4</td>
<td width="213" valign="top">11110100</td>
<td width="213" valign="top">00110100</td>
</tr>
<tr>
<td width="213" valign="top">5</td>
<td width="213" valign="top">11110101</td>
<td width="213" valign="top">00110101</td>
</tr>
<tr>
<td width="213" valign="top">6</td>
<td width="213" valign="top">11110110</td>
<td width="213" valign="top">00110110</td>
</tr>
<tr>
<td width="213" valign="top">7</td>
<td width="213" valign="top">11110111</td>
<td width="213" valign="top">00110111</td>
</tr>
<tr>
<td width="213" valign="top">8</td>
<td width="213" valign="top">11111000</td>
<td width="213" valign="top">00111000</td>
</tr>
<tr>
<td width="213" valign="top">9</td>
<td width="213" valign="top">11111001</td>
<td width="213" valign="top">00111001</td>
</tr>
</tbody>
</table>
<p>由于前4位都是一样的，不起辨别数值大小的作用，为节省内存，就采用4个二进制位来存储一个十进制数字。在一个字节中存放两个十进制数字，每个数字占半个字节（4位），最后符号也占半个字节（4位）。</p>
<p>对于负数，最后一个半字节（4位）为“1101”，对应16进制为字母D。</p>
<p>对于正数，最后一个半字节（4位）为“1100”，对应16进制为字母C。</p>
<p>对于无符号数，最后一个半字节（4位）为“1111”，对应16进制为字母F。</p>
<p>（5）COMP-5：定点二进制数。COMP-5型和COMP型数据内部存储形式一致，在特定的平台上用到，只不过COMP型数据使用大尾字节顺序存储，COMP-5型数据使用小尾字节顺序存储。不理解大尾字节和小尾字节的猛击<a title="Endianness" href="http://zh.wikipedia.org/zh/%E5%AD%97%E8%8A%82%E5%BA%8F" target="_blank">这里</a>。</p>
<p><span id="more-20"></span></p>
<p>Display型和COMP-3型数据分析比较</p>
<p>在介绍了COBOL语言中5种基本数据类型之后，针对数值型数据中的Display型（外部十进制）和COMP-3型（内部压缩十进制）数据进行分析比较，可以更好地理解数值型数据在计算机内存中的存储形式。详见表3和表4。</p>
<p>表3    Display型数据分析</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="90" valign="top">定义类型</td>
<td width="94" valign="top">初始数值</td>
<td width="94" valign="top">输出结果</td>
<td width="127" valign="top">内存16进制存储形式</td>
</tr>
<tr>
<td width="90" valign="top">9（5）V9（2）</td>
<td width="94" valign="top">+12345.67</td>
<td width="94" valign="top">1234567</td>
<td width="127" valign="top">F1F2F3F4F5F6F7</td>
</tr>
<tr>
<td width="90" valign="top">9（5）V9（2）</td>
<td width="94" valign="top">-12345.67</td>
<td width="94" valign="top">1234567</td>
<td width="127" valign="top">F1F2F3F4F5F6F7</td>
</tr>
<tr>
<td width="90" valign="top">S9（5）V92）</td>
<td width="94" valign="top">+12345.67</td>
<td width="94" valign="top">123456G</td>
<td width="127" valign="top">F1F2F3F4F5F6C7</td>
</tr>
<tr>
<td width="90" valign="top">S9（5）V92）</td>
<td width="94" valign="top">-12345.67</td>
<td width="94" valign="top">123456P</td>
<td width="127" valign="top">F1F2F3F4F5F6D7</td>
</tr>
</tbody>
</table>
<p>（1） 使用Value子句进行赋值（见图3）。</p>
<p><img src="http://farm5.static.flickr.com/4008/4641173350_2926e7d411_o.jpg" alt="" width="585" height="106" /></p>
<p>图3   使用Value子句给Display型数据赋初始值</p>
<p><img src="http://farm5.static.flickr.com/4050/4640565155_a8a1c64c6e_o.jpg" alt="" width="81" height="302" /></p>
<p>（2）使用Display语句输出结果（见图4）。</p>
<p>（3）使用Write语句写入到文件中的结果（见右图5）。<img src="http://farm5.static.flickr.com/4062/4640565113_a9cafeb360_o.jpg" alt="" width="272" height="93" /></p>
<p>图4 Display语句输出结果                                                                          图5   Write语句输出结果</p>
<p>表4 9型COMP-3数据分析</p>
<table border="1" cellspacing="0" cellpadding="0" align="left">
<tbody>
<tr>
<td width="146" valign="top">定义类型</td>
<td width="131" valign="top">初始数值</td>
<td width="131" valign="top">输出结果</td>
<td width="178" valign="top">内存16进制存储形式</td>
</tr>
<tr>
<td width="146" valign="top">9（5）V9（2）COMP-3</td>
<td width="131" valign="top">+12345.67</td>
<td width="131" valign="top">1234567</td>
<td width="178" valign="top">1234567F</td>
</tr>
<tr>
<td width="146" valign="top">9（5）V9（2）COMP-3</td>
<td width="131" valign="top">-12345.67</td>
<td width="131" valign="top">1234567</td>
<td width="178" valign="top">1234567F</td>
</tr>
<tr>
<td width="146" valign="top">S9（5）V9（2）COMP-3</td>
<td width="131" valign="top">+12345.67</td>
<td width="131" valign="top">123456G</td>
<td width="178" valign="top">1234567C</td>
</tr>
<tr>
<td width="146" valign="top">S9（5）V9（2）COMP-3</td>
<td width="131" valign="top">-12345.67</td>
<td width="131" valign="top">123456P</td>
<td width="178" valign="top">1234567D</td>
</tr>
</tbody>
</table>
<p>（1）使用Value子句进行赋值（图6）。</p>
<p><img src="http://farm5.static.flickr.com/4062/4641173496_250c2f2535_o.jpg" alt="" width="665" height="104" /></p>
<p>图6   使用Value子句给COMP-3型数据赋初始值<img src="http://farm4.static.flickr.com/3396/4641173540_e77bfa2481_o.jpg" alt="" width="50" height="305" /></p>
<p>（2）Display语句输出的结果（见下图7）。</p>
<p>（3）Write语句写入到文件中的结果（见右图8）。</p>
<p><img src="http://farm4.static.flickr.com/3373/4640565225_4cb21eaedf_o.jpg" alt="" width="285" height="86" /></p>
<p>图7 Display语句输出结果                                                                                    图8   Write语句输出结果</p>
<p>根据对比分析的情况得出来如下的结果：</p>
<p>（1）Value子句赋初始值要求数据完全匹配属性要求，9型描述符初始值中不允许出现“+”、“-”符号；Move语句赋初始值则只要求数据类型匹配，在初始值中可以带有“+”、“-”符号。</p>
<p>（2）不管是9型还是S9型描述符，对应Display和COMP-3两种存储形式“+”、“-”都不实际输出显示出来。</p>
<p>（3）对于Display型和COMP-3型存储形式，S9型描述符将符号位存储在最后一个半字节（4位），字母C表示符号为正，D表示符号为负，F表示无符号。</p>
<p>（4）Display型存储形式9型描述符和S9型描述符每一个数字占一个字节内存空间，符号和小数点都不占内存空间。</p>
<p>（5）COMP-3型存储形式由于采用压缩十进制方式存储，每一个数字占半个字节（4位）内存空间，再在最后增加半个字节（4位）存储符号位。因此，同样的数据内容COMP-3型存储比Display型节省内存空间。</p>
<p>（6）Write语句是按内存中存放的数据形式直接输出的，不进行EBCDIC编码[9]转换；Display语句则是将内存中存放的数据形式进行EBCDIC编码转换后然后再进行输出的。因此，写入到输出文件中看到的结果会产生乱码。</p>
<p>论文里面着重“研究”的就是上述这么点东西，欧冠决赛开始打响了，国米跟拜仁随便哪支赢球都将是“三冠王”，看球去了，到此为止。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bigbigben.cn/surfing-the-internet/mainframe-profession/summary-after-ktv.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

