理论教育 数据类型:整数、浮点数及转换

数据类型:整数、浮点数及转换

时间:2023-11-01 理论教育 版权反馈
【摘要】:1)整数类型是只表示整数的数据类型,该类型共有4种不同的数据类型。2)浮点类型主要用来表示小数,在VB.NET中采用三种数据类型来表示:Decimal、Single和Double。Decimal数据类型最多支持29位有效位数,可表示最大为7.9228×1028的值,主要用于方便货币和金融方面的计算。Single数据类型的最大正值为3.4028235E+38,精度为7位数;而Double数据类型的最大正值为1.79769313486231570E+308,精度为15位~16位数。将数字数据类型转换为Date类型时,VB.NET将它的值视为有符号整数。

数据类型:整数、浮点数及转换

数据类型指程序中数据的类型以及计算机如何存储这些类型的数据。每个变量、文本、常数、属性、过程参数和过程返回值都具有数据类型。除非使用无类型编程,否则必须声明所有编程元素的数据类型。

.NET中类型的两个基本类别是“值类型”和“引用类型”。两者的区别是:值类型的变量包含数据,而引用类型的变量包含的是对象的引用,下面分别进行介绍。

1.值类型

VB.NET语言中的值类型可以分为基础类型(Primitive Types)、枚举类型(Enum Types)和结构类型(Struct Types)。下面分别介绍这几种类型。

(1)基础类型(Primitive Types)

简单地讲,如果一个类型的值可以使用常数描述,该类型就是基础类型。基础类型总是有初始值的。

VB.NET常用的基础类型有:整数,浮点、布尔、日期和字符串。各种类型的存储分配如表4-1所示。

1)整数类型是只表示整数的数据类型,该类型共有4种不同的数据类型。有符号的整型数据类型是Short、Integer和Long。无符号整型是Byte,如果某个变量包含二进制数据或未知种类的数据,则将其声明为此类型。由于Byte是0~255范围内的无符号类型,它无法表示负数。如果将一元负(-)运算符用于取值为Byte类型的表达式,则Visual Basic首先将表达式转换为Integer类型。

表4-1 值类型

978-7-111-43915-8-Chapter04-14.jpg

978-7-111-43915-8-Chapter04-15.jpg

如果试图将整型变量设置为其类型范围以外的数字将会出错。如果试图将它设置为小数,则数字将四舍五入,如下例所示:

978-7-111-43915-8-Chapter04-16.jpg

存储在Byte变量和数组中的二进制数据在格式转换中被保留。不应对二进制数据使用String变量,因为在ANSI和Unicode格式之间转换时其内容会损坏。当VisualBasic读取文件或写入文件,或调用DLL、方法和属性时,这种转换会自动发生。

对于整型,文本类型字符用S表示Short,用I表示Integer,用L表示Long。没有文本类型字符表示Byte。

2)浮点类型主要用来表示小数,在VB.NET中采用三种数据类型来表示:Decimal、Single和Double。它们都是有符号类型。

Decimal数据类型最多支持29位有效位数,可表示最大为7.9228×1028的值,主要用于方便货币金融方面的计算。它需要记录的位数很大,但又不容许四舍五入误差。为Decimal变量或常量赋一个很大的值时,如果该值太大,不能用Long数据类型,必须将字符类型追加到数字类型,如下例所示:

978-7-111-43915-8-Chapter04-17.jpg

对于小数类型的数据,要在数据的后面加上“m”,例如:

978-7-111-43915-8-Chapter04-18.jpg

如果省略了“m”,在变量赋值之前将被编译器当作Double类型处理。

Single和Double数字的范围比Decimal数字大,但可能会导致四舍五入错误。

浮点可以用mmmEeee表示,其中mmm是尾数(有效数字),eee是指数(10的幂)。Single数据类型的最大正值为3.4028235E+38,精度为7位数;而Double数据类型的最大正值为1.79769313486231570E+308,精度为15位~16位数。

对于非整型,文本类型字符用D表示Decimal,用F表示Single,用R表示Double。

3)布尔和日期类型。VB.NET提供了几种不是面向数字或字符的数据类型。它们用于处理特殊的数据,如是/否和日期/时间值。

Boolean数据类型是被解释为True或False的无符号值。如果某个变量只能包含真/假、是/否或开/关信息,则将它声明为Boolean类型,Boolean的默认值是False。在下例中,RunningVB是一个存储简单的是/否的Boolean变量。

978-7-111-43915-8-Chapter04-19.jpg

Boolean没有文本类型字符。

Date数据类型是64位(8字节)有符号整数。每个增量表示从公历第1年的1月1号(12:00AM)开始经过的100毫微秒时间。Date数据类型的变量或常数包含日期和时间,如下例所示:

978-7-111-43915-8-Chapter04-20.jpg

如果在日期/时间文本中未包含日期,则VB.NET将该值的日期部分设置为0001年1月1号;如果在日期/时间文本中未包含时间,则VB.NET将该值的时间部分设置为当天的开始时间(即午夜)。

将数字数据类型转换为Date类型时,VB.NET将它的值视为有符号整数。如果试图转换负数,则会出错。

Date没有文本类型字符。但是,编译器将包含在数字符号(##)字符中的文本视为Date。

4)字符和字符串类型。VB.NET提供字符(Char)和字符串(String)类型用来处理可打印和可显示的字符。当它们处理的都是Unicode字符时,Char包含单个字符,而String包含任意个数的字符。

Char数据类型是单个双字节(16位)Unicode字符。可将如IsDigit和IsPunctuation这样的方法用于Char变量来确定其Unicode分类。VB.NET不在Char类型和数字类型之间直接转换。可以通过函数实现类型转换,如AscW和ChrW。

如果打开类型检查开关(OptionStrict),必须将文本类型字符追加到单字符字符串,以将其标识为Char数据类型,如下例所示:

978-7-111-43915-8-Chapter04-21.jpg

Char类型是无符号的,其文本类型字符是C。

String数据类型是零个或更多个双字节(16位)Unicode字符的序列。如果某个变量总是包含字符串而从不包含数值,则将它声明为String类型,如下例所示:

978-7-111-43915-8-Chapter04-22.jpg

然后可以将字符串赋给这个变量,并使用字符串函数操作此变量,如下例所示:

978-7-111-43915-8-Chapter04-23.jpg

978-7-111-43915-8-Chapter04-24.jpg

String数据类型包含Unicode字符,而每个Unicode字符都可在0和65535之间取值。String变量或参数总是“变长字符串”,它随着给它指派的新数据增大或缩小。

字符串有时由前导空格或尾随空格填充。Trim、LTrim和RTrim函数可移除这些空格。使用字符串时可能会发现这些函数很有用。

String没有文本类型字符。但是,编译器会将包含在双引号("")中的文本视为字符串。

(2)枚举类型(EnumType)是从System.Enum继承的类型,表示某个基元整型的值集。一般而言,对于枚举类型E,默认值为表达式Ctype(0,E)产生的值。

枚举的基础类型必须为一个可表示枚举中定义的所有枚举值的整型。如果指定基础类型,它必须为Byte、Short、Integer或Long。如果未显式指定基础类型,则默认值为Integer。

下面的示例声明了一个基础类型为Long的枚举:

978-7-111-43915-8-Chapter04-25.jpg

枚举成员列表中的标识符被声明为常数,可出现在需要常数的任何位置。用“=”进行的枚举成员定义将常数表达式所指示的值赋给关联的枚举成员。常数表达式必须计算为整型,而且必须位于可由基础类型表示的值范围内。常数表达式必须计算为可隐式转换为基础类型的类型,而且必须位于可由基础类型表示的值范围内。在下面的示例中,常数值1.5、2.3和3.3不能被隐式转换为基础整型Long,因此出错。(www.daowen.com)

978-7-111-43915-8-Chapter04-26.jpg

多个枚举成员可共享同一关联值,如下所示:

978-7-111-43915-8-Chapter04-27.jpg

此例显示了一个有两个枚举成员Blue和Max的枚举,两个枚举成员有相同的关联值。

如果第一个枚举数没有初始值设定项,则相应常数的值为零。无初始值设定项的枚举成员定义使前一枚举成员的值增加1,并将增加的值赋给当前的枚举数。此增加的值必须位于可由基础类型表示的范围内,否则将发生编译时错误。

978-7-111-43915-8-Chapter04-28.jpg

上例中,枚举成员Red没有设置初始值,但由于它是第一个枚举成员,所以被自动赋值为0。枚举成员Green被显式地赋值为10,枚举成员Blue前面的成员值增加1,并将增加的值自动赋给枚举成员Blue。所以上例打印出的枚举成员名称及其关联值为:

978-7-111-43915-8-Chapter04-29.jpg

(3)结构类型(Structure Type)通常是一组相关的信息合成的单一实体,其中的每个信息成为它的一个成员。结构类型在创建诸如点结构、文件类型结构、IP地址结构等小型对象时特别灵活。结构类型从System.Value Type继承,并且不能被继承。结构类型的变量直接包含结构的数据。

例如可以这样定义点的坐标的结构:

978-7-111-43915-8-Chapter04-30.jpg

978-7-111-43915-8-Chapter04-31.jpg

对结构类型的成员的访问可通过结构变量名加上“.”,后面跟成员的名称来完成,例如:

978-7-111-43915-8-Chapter04-32.jpg

其中,a和b都是Point结构类型的变量。结构类型包含的成员的数据类型可以相同,也可以不同,并没有限制。结构类型的成员本身也可以是结构类型的数据。

对于结构,每个变量都有自己的数据副本,因此对一个变量进行的操作不可能影响另一个变量。例如上面的示例,将a赋给b将创建该值的一个副本,因此b不会受到对a.x进行的赋值的影响,代码片段输出值为10。假如Point被改而声明为类,则由于a和b将引用同一对象,因此输出将为100。有关类的介绍将在下一小节中介绍。

2.引用类型

引用类型指的是该类型的变量不直接存储所包含的值,而是指向它所要存储的值,也就是说,引用类型存储的是实际数据的引用地址。VB.NET中的引用类型有如下几种:类(Class Type)、接口(Interface Type)、数组(Array Type)和代理(Delegate Type)类型。下面主要介绍类和数组这两种常用的引用类型。

(1)类类型(Class Type)。类是面向对象编程的基本单位,是一种包含数据成员、函数成员以及嵌套类型的数据结构,其中数据成员包括常数、变量和事件,函数成员包括方法、属性、索引器、运算符和构造函数等。

类类型支持继承,继承是派生类用以扩展和专用化基类的机制。对于类,两个变量引用同一个对象是可能的,因此对一个变量进行的操作可能影响另一个变量所引用的对象。

下面的示例显示了一个包含各种类成员的类:

978-7-111-43915-8-Chapter04-33.jpg

978-7-111-43915-8-Chapter04-34.jpg

下面的示例显示了这些成员的使用:

978-7-111-43915-8-Chapter04-35.jpg

978-7-111-43915-8-Chapter04-36.jpg

运行结果为:

978-7-111-43915-8-Chapter04-37.jpg

(2)数组类型(Array Type)。数组是指同类数据组成的集合,它包含多个通过“索引”访问的变量,该索引以一对一的方式对应于数组中的变量顺序,是数据最常用的存储方式之一。

数组中包含的变量(又称数组的“元素”)必须具有相同的类型,该类型称为数组的“元素类型”。数组元素在数组实例创建时出现,在数组实例销毁时消失。每个数组元素都初始化为其类型的默认值。类型System.Array是所有数组类型的基类型,不能实例化。每个数组类型继承由System.Array类型声明的成员,并且可以转换为Array或Object。

数组有一个“秩”,用于确定同每个数组元素关联的索引数。数组的秩还等于数组的“维度”数。例如,秩为1的数组称为一维数组,秩大于1的数组称为多维数组。

定义数组时,可以在“()”中定义数组的元素个数。如:

978-7-111-43915-8-Chapter04-38.jpg

使用数组时可以在“()”中加入下标来取得对应的数组元素。与VB的早期版本不同,在VB.NET中,数组索引的编号总是从零开始,一直到数组元素个数减去1。例如上面定义的整数型一维数组arr的元素个数是5,它的第一个元素是arr(0),第二个和第三个分别是arr(1)和arr(2)。

下面的示例创建一个整数值的一维数组,初始化数组元素并将它们分别打印出来:

978-7-111-43915-8-Chapter04-39.jpg

程序输出结果如下:

978-7-111-43915-8-Chapter04-40.jpg

下面来看看代码。首先通过如下代码新建了长度为5的Integer类型数组arr:

978-7-111-43915-8-Chapter04-41.jpg

接着给arr数组的元素赋初值,这个操作是通过一个for循环完成的,需要注意的是arr.GetUpperBound(0),该属性返回数组第一维的上界。

该循环执行完以后,arr数组中的每个元素都有自己的值,其值为数组元素下标的平方数,如arr数组的第4个元素arr[3]的值为3的平方,即9。赋值完成后通过另外一个for循环来读取并显示arr数组中元素的值。

数组的每个维度都有一个关联的长度。数组长度并不是数组类型的一部分,而是在运行时创建数组类型的实例时确定。维度的长度确定该维度的有效索引范围,对于长度为N的维度,索引范围可为从0~N-1。如果维度的长度为零,则该维度没有有效索引。数组中的元素总数是数组中各维度长度的积。如果数组的维度长度中有任何为零,就说明该数组为空。数组的元素类型可以是任何类型。

指定数组类型的方法是向现有类型名添加修饰符,修饰符由一个左括号、由零个或多个逗号组成的集合和一个右括号组成。经修饰的类型为数组的元素类型,维度数是逗号的数目加1。如果指定了一个以上的修饰符,则数组的元素类型是数组。修饰符的读取顺序是自左向右,最左边的修饰符是最外层的数组。在下面的示例中:

978-7-111-43915-8-Chapter04-42.jpg

arr的元素类型是一维Integer数组的三维数组的二维数组。

还可在变量名上放置数组类型修饰符或数组初始化修饰符,将变量声明为数组类型。在这种情况下,数组元素类型为声明中给定的类型,数组的维度由变量名修饰符确定。为清楚起见,在同一声明中的变量名和类型名上都放置数组类型修饰符是无效的。

下面的示例显示各种将Integer数组类型用作元素类型的局部变量声明:

978-7-111-43915-8-Chapter04-43.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈