COMP-1及COMP-2内部存储解析

在从事大型机的工作中,很多时候我们所做的都是读dump,然后反向找出VSAM/QSAM数据集中的不当记录,尤其当数据集很大的时候,精确定位一条记录很是不便。。。而这里介绍的利用浮点数反向查找就是一个捷径(比如:我们在dump里看到X‘C411570A‘,如果能快速算出-4439.039,再在数据集中搜索-4439.039,相信很容易就能锁定到你想要的目标记录),下面我们解析下,大型机是如何存储浮点数及我们又怎样快速算出其对应的十进制数据。

我们知道在COBOL里:

COMP-1是用来定义单精度浮点数的,占四个字节(对应于HLASM/mainframe assembler里的E定义)

COMP-2是用来定义双精度浮点数的,占八个字节(对应于HLASM/mainframe assembler里的D定义)

具体内部存储见下图:

解析如下:

第0位(最左边的bit位为第0位,以此类推)是符号位,0为正,1为负

第1—7位是指数位,初始值为X‘40‘,如果小数点左移1位,则初始值加1,为X‘41‘;如果右移1位,则减1,为X‘3F‘。

第8—31/8—63位是尾数位,也可以说是组合位(8—31是针对COMP-1,8—63针对COMP-2)。

1.主机是以纯小数并且十分位不为0的形式存储数据的

 地址  内存数据               常量名      常量数值

000064 427B74BC            14 A     DC   E‘123.456‘

000068 427B0000            15 B     DC   E‘123‘

00006C 4074BC6A            16 C     DC   E‘.456‘

000070 C27B74BC            17 X     DC   E‘-123.456‘

000074 00000000

000078 427B74BC6A7EF9DB    18 Y     DC   D‘123.456‘

A,B和C我们都定义成常量,并且可以把A看成是B + C之和

B: 123 = X‘7B‘按照要求应该变为0.7B * 16^2,由于指数为+2,所以指数的bit位就变成了X‘40‘+X‘2‘=X‘42‘,即内存为427B0000

C: 0.456=X‘0.74BC6A7EF9DB‘=0.74BC6A7EF9DB *
16^0,其本身已经符合要求了,所以内存为4074BC6A(由于C最多四个字节,后面的存储不了自动舍弃,这和我们常说的小说点后精确到多少位含义是一样)

计算机在进行加减之前,首先要保证指数一致,然后再保证小数点对齐。要理解这个,我们可以参考下十进制,比如100*10^1+ 0.008*10^2,一般的算法为:100*10^1+
0.008*10^2 = 1000 + 0.8 = 1000.8

其实这里隐含的约束也是先把指数变成一样,然后小数点对齐(只是这里指数部分为10^0)。

其实计算机也是这么做的:

1.先把前两位(指数位)变成相同:4074BC6A -> 41074BC6 -> 420074BC

2.然后再进行C+B=A的计算:420074BC+ 427B0000 = 427B74BC

再来看下X和Y,X是A的相反数,Y和A只是精度不同

X是负数,所以其内存第一个bit位是1。

Y被定义成双精度浮点数类型(COMP-2),可以看出A和Y的内存数据仅仅是精度不同而已。

2.剖析一个内存数据,比如:C211570A

1.由于第一个bit是1,所以它是个负数,

2.由于指数位是X‘42‘,即后面三个字节中的11为整数部分,570A为小数部分

3.整数部分11变成十进制为17

4.小数部分0.570A变成十进制为0.339996337890625,约等于0.34

(这里给个百度链接,十进制/十六进制转换工具:http://www.baidu.com/s?tn=baiduhome_pg&ie=utf-8&bs=Fraction&f=8&rsv_bp=1&rsv_spt=1&wd=01+%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6%E8%A1%A8%E7%A4%BA&rsv_sug3=9&rsv_sug=0&rsv_sug1=9&rsv_sug4=688&inputT=10402

5.即这个数字为-17.34

3.怎么从一个十六进制数据快速反推出我们想要的十进制

1)快速反推(由十六进制推算出十进制):

C211570A =(-X‘11570A‘/16^6)*16^2

= -X‘11570A‘/16^4

= -1136394/65536

= -17.34

C411570A = (-X‘11570A‘/16^6)* 16^4

= -X‘11570A‘/16^2

= -1136394/256

= -4439.039

2)快速正推(由十进制推算出十六进制):

17.34 = 0.1734 * 10^2

= 1734/10^2

= X‘6C6‘/ X‘64‘

= (X‘6C60000‘/ X‘64‘)*(1/X‘10000‘)

= 11570A*(1/ X‘10000‘)

这里为什么先让被除数乘X‘10000‘,是因为笔记本自带的计算机在进行16进制除法的时候,只显示整数部分.实际上,计算机也是没法表示16进制的小数部分的,因为我们平时说的小数点,都是针对十进制的,又有谁见过16进制的小数点长什么样子?

所以记入内存时再缩小X‘10000‘倍即可:X‘4211570A‘(如果不缩小应该是X‘4611570A‘)

以上方法的总体思想都是把除数和被除数都变成整数,然后再进行运算。

有疑问请联系:QQ349106216

时间: 2024-10-07 04:33:56

COMP-1及COMP-2内部存储解析的相关文章

Android内存解析(二)— 详解内存,内部存储和外部存储

总述 觉得十分有必要搞清楚内存,内部存储和外部存储的区别,还有我们在开发中真正将数据存在了手机的哪儿. 先提一个问题:手机设置的应用管理中,每个App下都有清除数据和清除缓存,清除的分别是哪里的数据? 一   内存,内部存储和外部存储 1. 可对Android手机存储空间做如下划分: 整个存储空间分为内部存储和外部存储两部分,内部存储中又包含RAM和ROM等部分. 2. 具体概念区分 内部存储,即InternalStorage,也常说内置存储卡,这是手机内置的存储空间,出厂时就被确定,是手机的一

Android Environment.getExternalStorageDirectory() 获取的是内部存储还是外部存储?

这几天在做Android应用的远程更新功能,将下载的更新包放在移动设备上指定的文件夹. 用的是  Environment.getExternalStorageDirectory() 这种方法.然后在获取的文件夹中新建一个hkapp文件夹,用来存放下载的apk文件. 那么,这个hkapp文件究竟是在那块存储区域呢? 一開始,看看网上的API,已经这种方法的字面意思.想当然地以为它就是获取SD卡上的文件夹,而不是手机的内部存储. 当然.除了望文生义之外,似乎还有确凿的证据支持我的观点.那就是在执行的

彻底理解android中的内部存储与外部存储

我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的时候又是清除的哪里的数据?读完本文相信你会有答案. 在android开发中我们常常听到这样几个概念,内存,内部存储,外部存储,很多人常常将这三个东西搞混,那么我们今天就先来详细说说这三个东西是怎么回事? 内存,我们在英文中称作memory,内部存储,我们称为InternalStorage,外部存储我

如何导出android内部存储的文件(不用root)

这段时间公司项目,涉及到数据缓存,由于需要缓冲的数据太多.太大,通过网络请求,再缓存到本地sqlite数据库,太费时间,消耗流量.所以准备先在本地保存一个标准版sqlite数据库(包含数据),打包到apk文件里,以后需要的操作就是更新数据,这样一来,请求和操作的数据就很小了. 那么问题来了,如何把标准版的sqlite数据库文件(db格式)从内部存储空间里面导出,然后放到项目中assets文件夹下? 想从内部存储空间里拷贝东西,首先要root,手机要root,APP也要获得root权限.这篇博客不

【转】 android中的文件操作详解以及内部存储和外部存储

摘要 其实安卓文件的操作和Java在pc环境下的操作并无二致,之所以需要单独讲解是因为安卓系统提供了不同于pc的访问文件系统根路径的api,同时对一个应用的私有文件做了统一的管理.根据我的经验,初学者在这部分感到很容易混淆内部存储和外部存储两个概念. 相对 其实安卓文件的操作和java在pc环境下的操作并无二致,之所以需要单独讲解是因为安卓系统提供了不同于pc的访问文件系统根路径的api,同时对一个应用的私有文件做了统一的管理.根据我的经验,初学者在这部分感到很容易混淆内部存储和外部存储两个概念

底子数据类型,数据内部存储及数据打印办法

i1底子数据类型有:    char\short\int\unsigned\long\float\double;2数据内部存储 数据内部存储是由"0101二进制构成,当次序员输入一个值 时,内部会转换成补码存储,只是单纯地存储数据,也不知道 将来输出是什么姿势. 例如:inta=-1;unsignintb=0xFFFFFFFF; 这两个数在内部存储是一样的3数据打印办法: 数据打印办法便是抉择内部存储的数据将来输出是什么姿势的上 述中 a和b值在内部存储是一样的所以只要它打印办法一样 效果必定一

存储和加载本地文件(内部存储设备)

Android设备上的所有应用都有一个放置在沙盘中的文件目录,将文件保存到沙盒中可以阻止其他应用的访问. 沙盒目录的全路径为:/data/data/<包名>  用File Explorer查看: 如上图可见,每个应用都在/data/data下有一个以此应用包名命名的文件目录. 而本文就是介绍将文件保存在/data/data/<包名>/files/ 目录下 下面就展示如何在内部存储设备中存储和加载本地文件: 1.创建一个名为 DataStorage的工程 2.准备好布局文件(acti

android数据存储_内部存储

源码下载(免下载积分):下载 你可以直接存储数据到内部存储中,默认情况下,文件存储到内部存储中是私有的,不能被 其他程序访问,当卸载应用程序,这些文件会被移除. 创建并写入数据可以有两种方法: 使用java中的相关的方法, 使用android.content中的相关方法,  调用 openFileOutput(),并返回FileOutputStream对象 调用FileOutputStream对象的write()方法 关闭流 读文件也是基本相同的方式. 在读文件有一点小技巧:如果想在编译时保存一

Android 在内部存储读写文件

文件读写操作* Ram内存:运行内存,相当于电脑的内存* Rom内存:内部存储空间,相当于电脑的硬盘* sd卡:外部存储空间,相当于电脑的移动硬盘在内部存储空间中读写文件>小案例:用户输入账号密码,勾选“记住账号密码”,点击登录按钮,登录的同时持久化保存账号和密码.界面如下: 1. 定义布局 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&