2.3 基本数据类型
数据类型是对系统中的实体的一种抽象,它描述了某种实体的基础特性,包括值的表示、存储空间的大小,以及对该值的操作。C++的数据类型包括基本数据类型和构造数据类型两类。构造数据类型又称复合数据类型,是一种更高级的抽象。当变量被定义为某种类型时会受到系统对该类型的特别保护,确保其值不受非法操作。为简单起见,此处只介绍C++的基本数据类型,构造数据类型将在第9章中详细介绍。
一般来说,C++语言的基本数据类型有如下4种。
● 整型:说明符为int。
● 字符型:说明符为char。
● 浮点型(又称实型):说明符为float(单精度)、double(双精度)。
● 布尔型:说明符为bool,只有两个取值。
为了满足各种情况的需要,上述的几种类型前面还可以加上修饰符改变原来的含义。主要的修饰符有如下4种。
● signed:表示有符号。
● unsigned:表示无符号。
● long:表示长型。
● short:表示短型。
上述4种修饰符都适用于整型和字符型,只有long还适用于双精度浮点型。数据类型规定的存储空间都是按字节算的,其占用的字节数会根据机器字长的不同而有所变化。
提示:一般来说,变量所占空间的大小与被定义的类型和机器有关,为此要注意哪些数据类型会受机器的影响。
C++中各种基本数据类型及其常用的派生类型的描述和取值范围如表2-2所示。
表2-2 C++基本数据类型
在上表中,如果在int整型数据类型前含有类型修饰符如short、signed等时,可省略int。例如,short int类型可简写为short类型。
2.3.1 整型
根据上面的介绍,读者可以知道,声明整型数据类型的关键字为int,如果给其加上unsigned、singed、short和long等修饰符,整型数据类型可分为4种,分别对应为无符号整型、有符号整型、短整型和长整型。其分别对应的取值范围读者可参见表2-2。例如,下列语句定义一个有符号的整型变量:
int i;
上述语句定义的变量i的取值范围为-231~231-1,这在一般的应用中已经足够了。因此,定义一个变量为int型是具体程序中应用较多的。除了定义整型变量外,常量也有整型。在程序中书写整型常量时,没有小数部分。用户可根据需要分别用十进制、八进制和十六进制的形式书写:
● 十进制格式:由数字0至9和正、负号组成,书写时直接写出数字,如123,-516,+1000等。
● 八进制格式:以数字0开头的数字(0至7)序列,如0111、010007、0177777等。
● 十六进制格式:以0x或0X开头的数字序列,如0x78AC、0xFFFF等。
【范例2-4】整型数据类型的使用。该范例是一个使用了整型数据类型的程序,在该程序中,定义了一个整型变量,给其赋值后输出,实现代码如代码清单2-4所示。
代码清单2-4
1 # include <iostream.h> //包含输入/输出头文件 2 void main() 3 { 4 int i; //声明整型变量 5 i = 123; //赋值 6 cout<<i<<endl; //输出 7 }
【运行结果】在Visual C++中创建一个【C++ Source File】,将上述代码输入其中,输出结果如图2-8所示。
图2-8 整型数据类型
【范例解析】范例2-4代码中,首先声明整型变量i,接着为其赋值,最后输出该变量中的值,其中,cout语句后的endl表示换行。
警告:如果赋值时为该整型变量赋非整型的值,如123.4,那么系统编译时将给出警告信息,如图2-9所示。如果不理会该信息,继续执行程序,那么Visual C++自动将小数去除,只取整数部分输出。
图2-9 警告信息
2.3.2 字符型
字符型数据类型只占据1字节,其声明关键字为char。同样地,可以给其加上unsigned、singed修饰符,分别表示无符号字符型和有符号字符型。例如,下列语句定义一个有符号的字符型变量:
char ch;
上述语句定义的变量ch可取任意ASCII码为-128~127的字符,在具体应用中使用较多的是ch中存储大小写字母。同样地,声明字符型常量需要注意:用一对单引号括起来的一个字符,单引号只是字符与其他部分的分割符,不是字符的一部分,并且不能用双引号代替单引号。在单引号中的字符不能是单引号或反斜杠。例如:
‘a’ , ‘A’, ‘#’ //合法的字符常量 ‘’’ , ‘\’ //非法的字符常量 “A” //不代表字符常量
另一种表示字符常量的方法是使用转义字符。C++规定,采用反斜杠后跟一个字母来代表一个控制字符,具有新的含义。此外,用一对双引号括起来的一个或多个字符的序列称为字符串常量或字符串。字符串以双引号为定界符,双引号不作为字符串的一部分。如:
“Hello”, “Good Morning!” ,“I say: \“ Goodbye!\””
字符串中的字符数称为该字符串的长度,在存储时,系统自动在字符串的末尾加以字符串结束标志,即转义字符‘\0’。
【范例2-5】字符串数据类型的使用。该范例是一个使用了字符型数据类型的程序,在该程序中,定义了一个字符型变量,给其赋值后输出,实现代码如代码清单2-5所示。
代码清单2-5
1 # include <iostream.h> 2 void main() 3 { 4 char ch1; //声明字符型变量 5 ch1 = 'a'; //赋值 6 cout<<"ch1= "<<ch1<<endl; //输出 7 int ch2; //声明字符型变量 8 ch2 = 'a'; //赋值 9 cout<<"ch2= "<<ch2<<endl; //输出 10 }
【运行结果】在Visual C++中创建一个【C++ Source File】,将上述代码输入其中,输出结果如图2-10所示。
图2-10 字符型数据类型
【范例解析】范例 2-5代码中,定义了字符型数据ch1和整型数据ch2,都给其赋值为字符“a”,输出后其结果不同,整型数据类型对应的变量ch2的输出为97,这是因为字符型数据类型在计算机内部是转换为整型数据类型来操作的,如上述代码中的字母a,系统会自动将其转换为对应的ASCII码值97。
注意:大小写英文字母所对应的ASCII值是不一样的,小写字母的对应的ASCII码值大于大写字母对应的ASCII值。
2.3.3 浮点型
浮点型数据类型亦即实数,当计算的表达式有精度要求时被使用。例如,计算平方根、正弦和余弦,它们的计算结果的精度要求使用浮点型。C++中有2种浮点型:单精度浮点型(float)及双精度(double)浮点型。其主要区别在于占用的字节数不同,前者为4字节,后者为8字节。
单精度浮点型(float)专指占用32位存储空间的单精度值。单精度在一些处理器上比双精度更快,而且只占用双精度一半的空间,但是当值很大或很小的时候,它将变得不精确。当用户需要小数部分并且对精度的要求不高时,单精度浮点型的变量是有用的。下面是一个声明单精度浮点型变量的例子:
float hightemp,lowtemp;
双精度型(double),正如其关键字“double”表示的,占用64位的存储空间。当用户需要保持多次反复迭代的计算的精确性时,或在操作值很大的数字时,双精度型是最好的选择。例如,前面计算圆面积,声明的常量和变量均为双精度型,如下所示:
double radius,area;
【范例2-6】浮点型数据类型的使用。该范例是一个使用了浮点型数据类型的程序,在该程序中,定义了一个双精度型变量,给其赋值后输出,实现代码如代码清单2-6所示。
代码清单2-6
1 # include <iostream.h> 2 void main() 3 { 4 double a; //声明双精度浮点型变量 5 a= 3.13564824; //赋值 6 cout<<a<<endl; //输出 7 }
【运行结果】在Visual C++中创建一个【C++ Source File】,将上述代码输入其中,输出结果如图2-11所示。
图2-11 浮点型数据类型
【范例解析】范例2-6代码定义了一个双精度浮点型变量a,并给其赋值后输出。读者可以看到,浮点型数据类型会对其精度进行取舍,例如,上述程序的输出并不会输出给定的变量a的完全值,而是进行了四舍五入。
提示:在Visual C++ 6.0中,使用较多的是double双精度数据类型。
2.3.4 布尔型
布尔型是最简单的数据类型,其只有两个值:true和false。同样地,声明为布尔型的变量,是具有两种逻辑状态的变量,包含两个值:真和假。
此外,如果要把一个整型变量转换成布尔型变量时,其对应关系如下:
● 如果整型值为0,则其布尔型值为假(false)。
● 如果整型值为1,则其布尔型值为真(true)。
【范例2-7】布尔型数据类型的使用。该范例是一个布尔型数据类型的程序,在该程序中,定义了一个布尔型变量,并为其赋值true,读者可观察其作用,实现代码如代码清单2-7所示。
代码清单2-7
1 # include <iostream.h> 2 void main() 3 { 4 double flag; //声明布尔型变量 5 flag= true; //赋值 6 cout<<flag<<endl; //输出 7 }
【运行结果】运行上述代码后,其结果如图2-12所示。
图2-12 布尔数据类型
【范例解析】范例2-7代码定义了布尔型变量flag,并给其赋值后输出。读者可以看到,其输出并不是true,而是输出整数值1,这是使用布尔数据类型需要注意的。
注意:如果在算术表达式中使用布尔型变量,那么将根据变量值的真假而赋予整型1或0。
除了上述介绍的4种基本数据类型外,C++还支持空值型(void)数据类型,这里就不再细述了,有兴趣的读者可参考相关文献。