免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5594 | 回复: 9
打印 上一主题 下一主题

Binary(4)与Integer(10)等价,why?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-19 15:34 |只看该作者 |倒序浏览
本帖最后由 niuhua77 于 2011-09-19 15:38 编辑

引子:
前几天有人问到:同一个QAPI中的同一个参数,为什么有的定义成Binary(4),而有的定义成Integer(10),并且二者皆出自IBM 官方的red book。IBM应该不会出现乌龙吧?
比如说下面的QAPI:
Create User Space (QUSCRTUS) API
Required Parameter Group:
1         Qualified user space name                                 Input                                 Char(20)
2         Extended attribute                                           Input                                 Char(10)
3         Initial size                                                        Input                                 Binary(4)
4         Initial value                                                      Input                                 Char(1)
5         Public authority                                                Input                                 Char(10)
6         Text description                                               Input                                 Char(50)

另一种定义版本:
Create User Space (QUSCRTUS) API
1         Qualified user space name                                 Input                                 Char(20)
2         Extended attribute                                           Input                                 Char(10)
3         Initial size                                                        Input                                 Integer(10)
4         Initial value                                                      Input                                 Char(1)
5         Public authority                                                Input                                 Char(10)
6         Text description                                               Input                                 Char(50)
我非常遗憾的告诉大家,IBM没有犯这么低级的错误,实际上二者是等价的。考虑到可能有像我一样的新手存在疑惑,下面就解释一下二者为什么等价。

首先说明一下各种数据类型,不同的数据长度所占的字节数(根据red book,不要问我why):

数据类型                      字节与位数的关系             取值范围
B(Binary):                   2bytes能表示4位数          -9999 ~ 9999
                                 4bytes能表示9位数          -999 999 999 ~ 999 999 999   

I(Integer):                 1bytes能表示3位数           -128 ~ 127  
                                2bytes能表示5位数           -32768 ~ 32767  
                                4bytes能表示10位数         -2147483648 ~ 2147483647
                                8bytes能表示20位数   

U(Unsigned):             1bytes能表示3位数            0 ~ 255      
                                2bytes能表示5位数            0 ~ 65535
                                4bytes能表示10位数          0 ~ 4294967295
                                8bytes能表示20位数          0 ~ 18446744073709551615

P(Packed):                 1bytes能表示1位数            -9~9
                                2bytes能表示3位数            -999 ~ 999
                                3bytes能表示5位数            -99999 ~ 99999-
                                4bytes能表示7位数            -9999999 ~ 9999999
                                …………

S(Zone):                   1bytes能表示1位数           -9 ~ 9
                                2bytes能表示2位数           -99 ~ 99
                                3bytes能表示3位数           -999 ~ 999
                                4bytes能表示4位数           -9999 ~ 9999
                                 …………

之所以说B(4)=I(10)是等价的,主要从两方面考虑,各自所占字节数和各自的取值范围。
1 所占字节:B(4)=4bytes  ,I(10)=4bytes 二者相等。
疑问:其他的数据类型也有占4bytes的[U(10)、P(7)、S(4)],为什么不能和B(4)等价呢?接着往下看:
2 取值范围:B(4): -999 999 999 ~ 999 999 999
                I(10): -2 147 483 648 ~ 2 147 483 647         
I(10)的取值范围完全包含B(4)的取值范围,从这两点上看,B(4)和I(10)是等价的。
下面再回答上面的疑问:
B(4)的取值范围并不能完全包含于U(10)、P(7)、S(4),总有一部分数值无法取得,所以B(4)不能与U(10)、P(7)、S(4)等价
以上就是Binary(4)与Integer(10)等价的原因啦。

注释1:
不过以Initial size      Integer(10)这个参数为例,B(4)实际上又等价与U(10),因为Initial size这个参数必须是大于0的(The initial size of the user space being created. This value must be from 1 byte to 16, 776, 704 bytes),B(4)的取值范围实际上是:1 ~ 999 999 999,而U(10)的取值范围:0 ~ 4294967295,远远超过999 999 999了,所以B(4)与I(10)也是等价的。

这个例子就是想告诉大家,QAPI的参数定义是很灵活的东西,不一定非得按部就班,熟悉个中缘由之后,自己可以根据实际需要,灵活的定义数据类型。

注释2:
有同学问,那B(8]等价于I(20)咯??
答案:NO!!
因为二进制数据仅有B(2)  B(4)两种,不存在B(1) B(3) B(8]等。系统会根据数据的位数自动分配2byte(4位数)和4bytes(5-9位数)。过9位数的话,系统会反白提示错误。

请大家选择性的参考,欢迎指正。

论坛徽章:
0
2 [报告]
发表于 2011-09-19 16:15 |只看该作者
回复 1# niuhua77


    前两天也被这个问题搞晕了,不明白为什么二者相等,不过看了您的帖子,有些明白了!
   很不错,

论坛徽章:
0
3 [报告]
发表于 2011-09-19 16:30 |只看该作者
回复 1# niuhua77


    想问您一个问题!
   您帖子中的B(4)中的‘4’是什么含义,是4BYTES的意思吗?I(10)是表示10位的I吧!如果B(4)中的‘4’是表示4位的B,也不相等了啊!

论坛徽章:
0
4 [报告]
发表于 2011-09-19 16:57 |只看该作者
回复 3# mylife400

你好!

    B(4)的意思是4位的二进制数据(Binary) 4位的Binary占4bytes
    I(10)的意思是10位的整形数据(Integer)  10位的Integer也占4bytes
    这里4和10并非bytes数,而是指每种数据类型的长度。从长度(位数)到所占字节数有一个转换的过程

论坛徽章:
0
5 [报告]
发表于 2011-12-22 08:58 |只看该作者
这个二进制和以前学的二进制果然不太一样。。。:wink:

论坛徽章:
0
6 [报告]
发表于 2011-12-22 09:05 |只看该作者
文章中有说  一、“B(Binary):                   2bytes能表示4位数          -9999 ~ 9999”
            二、“系统会根据数据的位数自动分配2byte(4位数)”

            三、所占字节:B(4)=4bytes  
                  四、B(4)的意思是4位的二进制数据(Binary) 4位的Binary占4bytes

看起来一&二 和 三&四有点矛盾,求分析求解释啊

论坛徽章:
0
7 [报告]
发表于 2011-12-22 20:29 |只看该作者
其实二进制最后在系统中也是用十进制来表示的。比如说1 byte = 8 bit = 2的8次方=256(十进制),就是说1个字节能表示的范围是从0-256

2 bytes = 16 bit =2的16次方=65536 即2个字节表示的十进制范围是0-65536,但是AS400系统有限制,它把2字节的二进制表示范围缩小了,只能表示0-9999。超过9999的部分就被系统舍弃掉了。 一个十进制的数字,长度小于等于4,(即小于9999),如果要用二进制表示的话,那么系统就给这个数字分配2个字节。即使这个数字=8,用1 byte就能表示了,但是系统还是会分配2个字节给他。

不知道你想表达的意思是这样不。总之你就把二进制想成十进制就好了

论坛徽章:
0
8 [报告]
发表于 2012-12-06 17:47 |只看该作者
楼主,研究的很深啊。佩服

论坛徽章:
0
9 [报告]
发表于 2012-12-06 22:10 |只看该作者
回复 8# ping222s


   

论坛徽章:
0
10 [报告]
发表于 2012-12-08 20:42 |只看该作者
回复 9# niuhua77

这俩天研究了一下,并且查了ibm的说明。
好像在程序里面定义4B,和4p在结果上是一样的。最大数位9999。
但是如果某个档案里面有字段A,类型为4B
H Extbinint(*Yes)

FXXXF   IF   E                 K Disk
D TTT                S                          Like(A)

如上,则TTT和10I,0是一样的。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP