3.2 数据类型
在Visual Basic语言中,为解决具体问题,要采用各种类型的数据,数据的类型不同,它所表达的数据范围、精度和所占据的存储空间均不相同。数据类型体现了数据结构的特点。Visual Basic提供了系统定义的数据类型,并允许用户根据需要定义自己的数据类型。
3.2.1 基本数据类型
Visual Basic 6.0提供的基本数据类型主要有字符串型数据和数值型数据,此外还提供了字节、货币、对象、日期、布尔和变体数据类型。
1. 字符串(String)
字符串是一个字符序列,由ASCII字符组成,包括标准的ASCII字符和扩展ASCII字符。在内存中一个字符用一个字节来存放。在Visual Basic中,字符串是放在双引号内的若干个字符,其中长度为0 (即不含任何字符)的字符串称为空字符串。
字符串通常放在引号中,例如:
"hello" "请输入用户名:" "你的用户名或密码错误!请重新输入" ""
Visual Basic中的字符串分为两种,即变长字符串和定长字符串。其中变长字符串的长度是不确定的,可以有0~231(2的31次幂,约21亿)个字符。而定长字符串含有确定个数的字符,最大长度不超过216(2的16次幂,65 535)个字符。
2. 数值
Visual Basic的数值型数据分为整型数和浮点数两类。其中整型数又分为整数和长整数,浮点数分为单精度浮点数和双精度浮点数。
(1)整型数
整型数是不带小数点和指数符号的数,在机器内部以二进制补码表示。例如,整型数2、-2分别以下面的形式存放:
2 00000000 00000010
-2 11111111 11111110
❑整数(Integer):整数以两个字节(16位)的二进制码表示和参加运算,其取值范围为-32 768~32 767。对于-32 768~32 767之间的一个数字,在尾部加一个“%”符号也表示一个整型数,如123%,-45%。
❑长整数(Long):长整数以带符号的4个字节(32位)二进制数存储,其取值范围为-2 147 483 648~+2 147 483 647。在-2 147 483 648~+2 147 483 647之间的数尾数加一个“&”符号也表示一个长整数,如123 456&。
(2)浮点数
浮点数也称实型数或实数,是带有小数部分的数值。它由3部分组成:符号、指数及尾数。单精度浮点数和双精度浮点数的指数分别用“E”(或“e”)和“D”(或“d”)来表示。例如:
12.345E6或12.345e+6单精度数,相当于12.345乘以10的6次幂。
12.34567D6或12.34567d+6双精度数,相当于12.34567乘以10的6次幂。
在上面的例子中,12.345或1234567是尾数部分,e+6(也可以写作E6或e6)和d+3(也可以写作D3或d3)是指数部分。
❑单精度浮点数(Single):以4个字节(32位)存储,其中符号占1位,指数占8位,其余23位表示尾数,此外还有一个附加的隐含位。通常以指数形式(科学记数法)来表示,以“E”或“e”表示指数部分。单精度浮点数可以精确到7位十进制数,其负数的取值范围为-3.402 823E+38~-1.401 298E-45,正数的取值范围为1.401 298E-45~3.402 823E+38。
❑双精度浮点数(Double):用8个字节(64位)存储,其中符号占1位,指数占11位,其余52位用来表示尾数,此外还有一个附加的隐含位。通常以指数形式(科学技术法)来表示,以“D”或“d”表示指数部分。双精度浮点数可以精确到15或16位十进数,其负数的范围为-1.797 693 134 862 316D+308~-4.940 65D-324,正数的范围为4.940 65D-324~1.797 693 134 862 316D+308。
3. 货币(Currency)
货币数据类型是为表示钱款而设置的。该类型数据以8个字节(64位)存储,精确到小数点后4位(小数点前有15位),在小数点后4位以后的数字将被舍去。一般数值型数据在计算机内是通过二进制方式进行运算的,因而有误差,而货币型数据是用十进制方式进行运算的,所以具有比较高的精确度,其取值范围为-922 337 203 685 477.580 8~922 337 203 685 477.580 7。对于该取值范围内的数,尾部带“@”符号也表示货币型数,如123@、456.5@。
浮点数中的小数点是“浮动”的,即小数点可以出现在数的任何位置,而货币数据类型的小数点是固定的,因此称为定点数据类型。
4. 变体(Variant)
变体数据类型也称通用型,是一种通用的、可变的数据类型,可以表示任何值,包括数值、字符串、日期/时间等。假设定义x为通用型变量:
Dim x As Variant
在变量x中可以存放任何类型的数据,如:
x=3.5 '存放一个实数 x= "BASIC" '存放一个字符串 x= "08/31/2007" '存放一个日期型数据
根据赋给的值的类型不同,变量x的类型也在不断变化,这就是称之为变体型的由来。当一个变量为定义类型时,Visual Basic自动将该变量定义为Variant类型。不同类型的数据在Variant变量中是按其实际类型存放的(例如将一个整数赋值给x,在内存区中按整型方式存放),用户不必作任何转换,转换的工作由Visual Basic自动完成。
Visual Basic提供一种VarType函数,用来测定一个Variant变量的实际数据类型。VarType函数的值是一个数值,其含义见表3.1。
表3.1 VarType函数值
例如:
01 Dim Var1 As Variant 02 Int1=123 03 Long1=456& 04 Single1=12.3! 05 Double1=45.6 06 Str1= "abc" 07 Cur=1234@ 08 Da=#07/12/2003# 09 Print VarType(Var1),VarType(Int1), VarType(Long1), VarType(Single1) 10 Print VarType(Str1),VarType(Cur), VarType(Double1), VarType(Da)
Var1被定义成Variant型变量,程序中未对它赋值,其他各变量均未声明何种类型,也一样按Variant型对待。分别对8个Variant型变量赋值。然后用VarType函数测试这8个变量的实际类型,可以从输出结果中看到它们的实际数据类型。
为运行以上程序段,可以在窗体上添加一个命令按钮,设名称为Command1,再将以上程序段写在Command1_Click事件过程中。运行程序,单击命令按钮,输出结果如下:
0(未赋值) 2(整型) 3(长整型) 4(单精度型)
8(字符串型) 6(货币型) 5(双精度型) 7(日期型)
5. 其他数据类型
除上面介绍的数据类型外,在Visual Basic 6.0中还可以使用其他数据类型,如下所示。
(1)字节(Byte)
字节实际上是一种数据类型,以1个字节的无符号二进制数存储,其取值范围为0~255。
(2)布尔(Boolean)
布尔型数据是一个逻辑值,用两个字节存储,它只取两种值,即True(真)或False(假)。
(3)日期(Date)
日期存储为IEEE 64位(8个字节)浮点数值形式,可以表示的日期范围从公元100年1月1日~9999年12月31日,而时间可以从0:00:00~23:59:59。任何可辨认的文本日期都可以赋值给日期变量。日期文字须以符号“#”括起来,例如,#January 1 2006#。
日期型数据用来表示日期信息,其格式为mm/dd/yyyy或mm-dd-yyyy,取值范围为1/1/100到12/31/9999。
注意
在当前的Visual Basic版本中,输出年份时通常只输出后两位,例如“1997”输出时为“97”。对于2000年以后的年份,其输出为“00”、“01”等。因此,在输出2000以后的年份时,应作适当处理(例如在前面加上“20”)。
(4)对象(Object)
对象型数据用来表示图形、OLE对象或其他对象,用4个字节存储。
(5)Decimal数据类型
Decimal变量存储为96位(12个字节)无符号整型形式,并除以一个10的幂数,称为变比因子。这个变比因子决定了小数点右面的数字位数,其范围从0~28。当变比因子为0(没有小数位)时,最大的可能值为±79 228 162 514 264 337 593 543 950 335。而在有28个小数位的情况下,最大值为±7.922 816 251 426 433 759 354 395 033 5,而最小的非零值为±0.000 000 000 000 000 000 000 000 000 1。
注意
目前Decimal数据类型只能在变体类型(Variant)中使用,也就是说,不能把一个变量声明为Decimal类型。
以上介绍了Visual Basic中的基本数据类型。表3.2列出了这些数据类型的名称、取值范围和存储要求。
表3.2 Visual Basic基本数据类型
3.2.2 自定义数据类型
有时会感到仅有以上基本数据类型是不够的,还需要将不同类型的数据组合成一个有机的整体,以便于引用。这样一个整体是由若干不同类型的、互相有联系的数据项组成的。它类似与C语言中的“结构体”类型的数据。这种结构称为“纪录”。Visual Basic提供了Type语句让用户自己定义这种数据类型。它的格式如下。
Type 数据类型名 数据类型元素名 As 类型名 数据类型元素名 As 类型名 ⋯ End Type
其中“数据类型名”是要定义的数据类型的名字,其命名规则与变量的命名规则相同(见下一节);“数据类型元素名”也遵守同样的规则,但不能是数组名;“类型名”可以是任何基本数据类型,也可以是用户定义的类型。
用Type语句可以定义类似于Pascal、Ada语言中“记录类型”和C语言中“结构体”类型的数据,因而通常把用Type语句定义的类型称为记录类型。
例如,定义一个名为Student(学生)的类型,其中包括学号、姓名、年龄、电话和住址等信息,定义语句如下。
01 Type Student 02 StuNo As Integer 03 Name As String *10 04 Age As Integer 05 Tel As String *10 06 Address As String *20 07 End Type
在定义了Student类型之后,就可以定义Student类型的变量,例如,定义一个Stu的变量:
Dim Stu As Student
此语句定义了Student类型的变量Stu,它包括5个成员。在后面的程序中可以用“变量.元素”这样的形式来引用各个成员,如下所述。
❑Stu.Name表示Stu变量中的Name成员的值(某学生的名字)。
❑Stu.Address表示Stu变量中的Address成员的值(某学生的家庭住址)。
❑Stu.StuNo表示Stu变量中的StuNo成员的值(某学生的号码)。
在使用Type语句时,应注意以下几点。
❑记录类型中的元素可以是变长字符串,也可以是定长字符串。当在随机文件中使用时,必须使用定长字符串,其长度用类型名称加上一个星号和常数指明,一般格式为:String *常数。这里的“常数”是字符个数,它指定定长字符串的长度,例如:rMonth As String *3。
❑记录类型的定义必须放在模块(包括标准模块和窗体模块)的声明部分,在使用记录类型之前,必须用Type语句加以定义。在一般情况下,记录类型在标准模块中定义,其变量可以出现在工程的任何地方。当在标准模块中定义时,关键字Type前可以有Public(默认)或Private;而如果在窗体模块中定义,则必须在前面加上关键字Private。
❑在记录类型中不能使用动态数组。
❑在随机文件操作中,记录类型数据有着重要的作用。
3.2.3 枚举数据类型
前面介绍了Visual Basic的基本数据类型,包括整型、实型(浮点)、字符串型等。在程序设计中,有些数据无法直接用整型数或实型数来表示,其取值为部分可列举的数值或者字符串等。为此,Visual Basic提供了枚举数据类型。当一个变量只有几种可能的值时,可以定义为枚举类型。所谓“枚举”是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。
枚举类型放在窗体模块、标准模块或公用类模块中的声明部分,通过Enum语句来定义,格式如下。
[Public|Private] Enum 类型名称 成员名 [=常数表达式] 成员名 [=常数表达式] ... End Enum
说明:
(1)Enum语句以Enum开头,以End Enum结束,各参量含义如下。
❑Public:可选。表示所定义的Enum类型在整个工程中都是可见的,在默认情况下,Enum类型被定义为Public。
❑Private:可选。表示所定义的Enum类型只在所声明的模块中是可见的。
❑类型名称:必须有。表示所定义的Enum类型的名称。“类型名称”必须是一个合法的Visual Basic标识符,在定义Enum类型的变量或参数时用该名称来指定类型。
❑成员名:必须有。是一个合法的Visual Basic标识符,用来指定所定义的Enum类型组成元素的名称。
❑常数表达式:可选。元素的值是Long类型。它可以是其他Enum类型。
(2)在Enum语句的格式中,“常数表达式”可以省略。在默认情况下,枚举中的第一个常数被初始化为0,其后的常数则初始化为比前面的常数大1的数值。例如:
01 Public Enum Days 02 Sunday 03 Monday 04 Tuesday 05 Wednesday 06 Thursday 07 Friday 08 Saturday 09 End Enum
定义了一个枚举类型Days,它包括7个成员,都省略了“常数表达式”,因此常数Sunday的值为0,常数Monday的值为1,常数Tuesday的值为2等。
(3)可以用赋值语句显示地给枚举中的常数赋值,即不省略“常数表达式”,所赋的值可以是任何长整数,包括负数。如果希望用小于0的常数代表出错条件,则可以给枚举常数赋一个负值。例如:
01 Public Enum WorkDays 02 Monday 03 Tuesday=0 04 Wednesday 05 Thursday 06 Friday 07 Saturday 08 Sunday 09 Invalid=-1 10 End Enum
在上面的枚举中,常数Invalid被显式地赋值-1,而常数Tuesday被赋值为0。因为Monday是枚举中的第一个元素,所以也被赋值0。Wednesday的数值为1(比Tuesday的数值大1),Thursday的数值为2等。
(4)Visual Basic将枚举中的常数数值看作长整数。如果将一个浮点数值赋给一个枚举中的常数, Visual Basic将该数值取整数为最接近的长整数。
(5)当对一个枚举中的常数赋值时,可以使用另一个枚举中的常数的数值。例如:
01 Public Enum WorkDays 02 Sunday=0 03 Monday 04 Tuesday 05 Wednesday 06 Thursday 07 Friday 08 Saturday=Days.Saturday-6 09 Invalid=-1 10 End Enum
这里的WorkDays枚举的声明与前面的声明等同。
说明
声明枚举类型后,就可以声明该枚举类型的变量,然后使用该变量存储枚举常数的数值。
3.2.4 类型之间的转换
Visual Basic提供了几种数据类型的转换函数,可以实现数据类型之间的转换。表3.3是各种转换数据类型的函数。
除表3.3中的转换函数以外,经常会遇到的转换函数还有Val和Str两个函数。Val用于将数值字符串转换为数值型,例如,Val("123")的结果为数值123,又例如Val("999abc111")的结果为999。而Str用于将数字转换为字符串,其功能正好与Val函数相反,例如,Str(678)的结果为字符串“678”。
表3.3 数据类型转换函数