购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 数据类型

在MCGSE中,数据类型非常简单,只有三种,即开关型、数值型和符号型,这与C、Visual Basic、C#等高级语言的数据类型大不相同,进行了简化。开关型变量相当于大家熟知的整型变量,数值型变量相当于单精度浮点型变量,字符型变量相当于字符串变量。

(1)开关型变量 开关型变量是指0或非0的整数,把整数分成了两部分,像3、-5等都属于非0值。开关型变量相当于C语言中的整型变量,由4个字节构成,4个字节共计32个位(4字节×8位/字节),分为正、负两部分,正数有2 31 个,范围是0~(2 31 -1),负数有2 31 个,范围是-2 31 ~-1,整个数值范围是-2 31 ~(2 31 -1)。MCGSE组态软件经常输出控制某个开关量,例如电磁阀、继电器、光电开关等,如果某个开关型变量与继电器相关联,当这个变量的值为非0(1、2、-3、1000等)时,系统会输出高电平给继电器,继电器获得高电平电压后便可打开,相当于给继电器通电;相反,如果变量的值为0,则继电器获得低电平,继电器关闭,相当于断电。因此,非0就表示开,0表示关。开关型变量如果仅用于开关量,那它的功能仅用了一小部分,实际上开关型变量主要用于整数,如,!I2Ascii、!I2Bin、!I2Hex、!I2Oct等函数中的字母“I”表示“Integer”,即整数的意思,这些函数的输入参数为开关型变量,但是从功能上看,是将整数转化为ASCII码、将整数转化为二进制、将整数转化为十六进制、将整数转化为八进制。因此,仍然是将开关型变量当作整数使用了。可参考二维码视频讲解。

(2)数值型变量 带小数点或不带小数点的数值,如:12.45,100。属于单精度浮点型,占4个字节(32位)内存空间,其数值范围为-3.4×10 -38 ~3.4×10 38 ,只能提供七位有效数字。

(3)字符型变量 最多512个字符组成的字符串,采用英文双引号包含。如:“合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。”“NO pains! NO gains!”等,使用字符串变量需要注意的是必须采用“英文双引号”,中文双引号虽然也是引号,但是在计算机语言中被当成字符处理,就像“ABC、中华人民共和国”等字符一样,不是关键字。因此,使用字符型变量时一定要十分小心!

2.3.1 开关型

开关型即整型,由4个字节构成,如图2-4所示,采用补码方式存储,从右向左数,第一位为0位,第二位为1位,第三位为2位,……,最后一位为31位。最高位31位表示正、负号,“1”表示负号,“0”表示正号。

正数的补码是其本身,如+1、+4096,分别用正数的二进制数表示,例如,6378是正数,对应的二进制位最高位是0,转换为二进制编码为:

图2-4 开关型数据(整数)编码示意图

(0000 0000 0000 0000 0001 1000 1110 1010)→+6378

负数的补码为负数绝对值对应二进制取反再加1,例如,-4096的绝对值为4096,对应的二进制编码为:

(0000 0000 0000 0000 0001 0000 0000 0000)→+4096

(1111 1111 1111 1111 1110 1111 1111 1111)→+4096取反

(1111 1111 1111 1111 1111 0000 0000 0000)→+4096取反+1

MCGSE对开关型数据采用字符串进行转化,如下面函数!Hex2I(s)所示。

函 数 名:!Hex2I(s)。

函数意义:把16进制字符串转换为数值。

返 回 值:开关型。

参数:s, 字符型。

实例:!Hex2I("11") =17。

“!”表示一个函数的开始,这是MCGSE系统对函数的约定,实际上,MCGSE采用的是一种类Basic的语言,对底层函数进行了封装,减弱了原始语言的灵活性,增加了用户使用的方便性。“Hex”是英文“hexadecimal”的前三个字母,意思是“十六进制”,“2”的英文发音与“to”相同,意思是转换,“I”是英文“Integer”(整数)的首字母,所以上述函数的意思是将一个字符串形式的16进制数转化为一个整数(开关型)。如果十六进制超范围会怎样呢?MCGSE系统会自动截断,比如:

!Hex2I("FF11223344")=287454020=!Hex2I("11223344"),前面的“FF”被截去了,所以并不会出现溢出错误,说明MCGSE对数据范围进行了预处理。“287454020”就是对应十六进制数“11223344”的十进制数。

如果输入的是非十六进制字符串,会当作“0”处理,例如:

!Hex2I("MNOPQ")=0。

在函数书写过程中,注意三点:第一,前面的“!”不能省略;第二,函数后面的括号必须是英文括号“()”,这有别于中文括号“()”,一个窄,一个宽;第三,括号内十六进制要用英文双引号引起来,也不能用中文双引号。下述几个例子是错误的:

Hex2I("FE32")   (Χ);没有“!”, 前面应该加“!”。

!Hex2I("FE32")  (Χ);括号为中文括号, 应该为英文括号。

!Hex2I(“FE32”)   (Χ);双引号为中文双引号, 应该为英文双引号。

2.3.2 数值型

在C/C++语言中,实型分为单精度浮点型和双精度浮点型两种。在MCGSE中,数值型指的是单精度浮点型,数据采用单精度浮点型(float)存储时,占用32个比特(bit)位,即4个字节宽度。单精度浮点型数据在存储方式上遵循电气电子工程师协会(Institute of Electrical and Electronics,IEEE)颁布的754标准,其存储格式如图2-5所示,图中的“*”表示可正可负,在存储中可分为以下三个部分:

图2-5 单精度实型存储格式

(1)符号位(sign) 符号位是存储空间中最左边的1个位,即第31个位,用0代表正,1代表负,为了便于记忆,可以认为“1”是负号“-”竖起来的一种形式,这样就不会将正、负混淆。

(2)指数部分(exponent) 用科学记数法表示实数时,其形式为 a ×10 n ,其中1≤| a |<10。 n 是整数,表示指数。指数部分表示幂 n 的位区间,占用存储空间中的第23~30位,共计8个位。

(3)尾数部分(mantissa) 尾数部分表示科学记数法中尾数 a 的位区间,占用存储空间中的第0~22位,共计23个位。此外,浮点数有两个例外,数0.0存储为全零;无限大数的符号位指示正无穷或者负无穷,指数部分存储为全1,尾数部分全零。可参考二维码视频讲解。

显然,用科学记数法表示实数时,采用的是十进制,例如,8.125用科学记数法表示为8.125×10 0 ,-42.5用科学记数法表示为-4.25×10 1 。但是,计算机以二进制形式存储数据,只能出现0或1。因此,要将待存储的数用二进制的科学记数法表示,其形式为±1.xxx…×2 n ,其中 n 表示8个位的二进制指数,xxx…为23个位的二进制尾数。由于尾数中没有包括小数点前面的“1”,实际上尾数表示的值为1.xxx…,这样,23个位就能够表示24个位的数值,2 (23+1) =16777216,由于10 7 < 16777216 < 10 8 ,因此,单精度浮点数的有效位数是7位。

IEEE754规定,浮点型数据对应的机器数表示形式为±1.xxx…×2 n ,其尾数部分采用了规范化格式1.xxx…,而不是0.xxx…,这样导致整个浮点型数据由±0.xxx…× 变为1.xxx…×2 n ,指数部分由 n +1减为 n ,变为机器数时,指数部分的 n 和尾数部分小数点以后的部分参与编码,此时,尾数小数点前的1不参加编码,但实际上表示的含义已经包括进去了,相当于尾数部分首位1会隐藏掉,例如,指数部分为3(0000 0011)时,相当于128(1000 0000)加上3,结果为131(10000 0011),由于尾数部分进行了左移,指数部分可以减少1,把尾数的首位数字1隐去,所以131实际上是130,相当于128+2=127+3,为便于记忆直接称为127移码。对于8个位的二进制指数部分,其表示范围为0~(2 8 -1),即0~255,如图2-6所示,把这个8位二进制数看成无符号数,再减去127,此时表示的范围应该为-127~128,即-(2 7 -1)~2 7

图2-6 指数部分原数据移位存储过程示意图

根据单精度存储格式可知,指数部分最大值为255,表示无穷大,除此之外,比255小的最大数为254,这个数值为移位存储的数据,原数据为254-127=127,所以单精度浮点数可以表示的范围为±3.4028235×10 38 (±1.1111…1×2 127 ),由于采用的是二进制,此处的1.1111…1实际上是1+1/2+1/4+1/8+1/16+…+1/(2×23),这是个等比数列,其累加和应该为1×(1-1/2 24 )/(1-1/2)=2×(1-1/2 24 )= 1.99999988079071044921875,而2 127 为1.7014118346046923173168730371588×10 38 。因此,±1.1111…1×2 127 所能表示的范围为是±3.4028235×10 38 。对于接近于0的最小值,由于指数部分全为零表示0.0,比0大的最小数为1,这个数值也是移位存储的数据,原数据应为1-127=-126,因此,单精度浮点型数据可以表示的最小数为±1.17549×10 -38 (±1.00…0×2 -126 )。图2-7给出了采用单精度浮点型数据存储时所能表示的数值范围,从图中可以看出,其范围并不是连续的,其中0.0、正无穷和负无穷为孤立点,正数区间和负数区间为“连续区”,实际上用数字表示实数是一种将连续量表示为离散量的过程。因此,这里的“连续区”是“连贯”的离散区,细小到两个相连的小数时仍然具有间隔。可参考二维码视频讲解。

图2-7 单精度浮点型数据存储范围示意图

为了清楚地说明单精度浮点型数据在计算机中的存储格式,下面分别以+8.125和-42.25两数为例,详细介绍其转化为二进制数据的过程,如图2-8所示,该过程分为五个步骤:

图2-8 单精度浮点型数据转换为计算机二进制数的过程示意图

第一步,将待存储的数字用带有符号的形式表示出来,如8.125为+8.125。

第二步,以小数点为间隔,将数字分为前后两部分,前半部分为整数,后半部分为小数。整数按“除2取余,自下而上”法转化为二进制,如8.125中前半部分为8,8除以2,余数为0,商为4;4除以2余数为0,商为2;2除以2余数为0,商为1;1除以2余数为1,商为0,整理余数部分,8转化为二进制数1000。小数按“乘2取整,自上而下”法转化为二进制,如8.125中后半部分为0.125,0.125乘以2,整数部分为0,小数部分为0.25;0.25乘以2,整数部分为0,小数部分为0.5;0.5乘以2,整数部分为1,小数部分为0,整理整数部分,0.125转化为二进制数0.001。

第三步,将数字二进制小数点前半部分加上后半部分,获得完整的二进制表示形式,8.125即可表示为1000.001,这一步需要注意的是:取余和取整时应按图2-8中箭头所示方向安排顺序,不能颠倒。然后将二进制数字用二进制科学记数法来表示,其结果为1.000001×2 3

第四步,按单精度存储格式对上述二进制数字进行变换,“+”表示正号,说明第31位为0;指数为3,用3加上127得130,将130转化为二进制数1000 0010;尾数部分为去掉小数点前的1以后剩下的部分,如果不足23位,其余位用0补充,如果超过23位,则去掉23位以后的数字。按照“符号位+指数位+尾数位”格式写出二进制编码“0+1000 0010+0000 0100 0000 0000 0000 000”。

第五步,将符号位、指数部分和尾数部分的二进制数合在一起,共计32个位,每8个位构成一个字节,即“01000001 00000010 00000000 00000000”,每个字节前4位和后4位分别用十六进制数表示,即“41 02 00 00”,这个数就是8.125在计算机中的存储形式。

同理,按上述方法,也可将-42.25转化为“C2 29 00 00”。可参考二维码视频讲解。

2.3.3 字符型

MCGSE中的字符型数据实际上是字符串,即是采用英文双引号包括起来的各种可显示符号,如数字、大小写英文字母、标点符号、汉字等。操作字符型的函数可以分为两大类,一类是字符串操作函数,如图2-9所示;另一类为字符型数据与开关型和数值型数据相互转换函数,如图2-10所示。

图2-9 MCGSE中字符型数据操作函数统计图

图2-10 MCGSE中字符型数据与开关型和数值型数据

字符串操作函数包括字符串比较函数、字符串长度计算函数、字符串截取函数、字符串统一大小写函数和字符串去空格函数,在这些函数中,字符串长度计算函数较特殊,这个函数的功能是获得字符串的长度,对于ASCII码而言,其长度相当于对应字母、数字或符号的个数,但是,对于汉字,其长度相当于2倍的汉字个数。例如,“中国”这个字符串,如果用!Len("中国")计算字符串长度,值为4。计算机内部存储汉字时采用的是GBK码,一个汉字用两个字节来表示,“中”的GBK码为“D6 D0”,“国”的GBK码为“B9 FA”。所以“中国”字符串的长度为4,即4个字节长度。有趣的是,在字符串截取函数中,指示要截取几个的数字又表示完整的汉字,例如,!Left("中国China",4)的结果为"中国Ch",在这个函数中,4又表示4个完整的字符数,即"中国Ch"这4个字符,而不是字节数。因此,需要大家细心甄别,掌握MCGSE函数的使用规则,不至于在使用过程中发生歧义和错误理解。

字符型数据与开关型和数值型数据相互转换函数主要用于各种计算过程,参加运算的必须为整型(开关型)和浮点型(数值型)的数据,一些动态展示过程也必须与数值型数据关联,如曲线显示

、位置移动、颜色变化、形状大小改变等。因此,在字符型与开关型、字符型与数值型之间需要函数进行转换,如图2-10所示。这些函数涉及十进制与二进制、十进制与八进制、十进制与十六进制、数值与字符串的相互转换,二进制、八进制、十六进制都是以字符串格式赋值,十进制以开关型(整型)赋值,数值以单精度浮点型赋值。归纳起来,实际上都是整型(开关型)+单精度浮点型(数值型)与字符串(字符型)之间的转换。可参考二维码视频讲解。 M9krDkfcTgAQSxy7Pfo2fduwTN4KOhUu/ejc/LibbHfqHDof6ELjpmN6bRJRLYnu

点击中间区域
呼出菜单
上一章
目录
下一章
×