2.3 C++数据类型
微视频
掌握并合理定义数据类型是学好一门编程语言的基础。因此,在学习用C++语言编写程序前,首先要学习的就是C++语言中的数据类型。不同的数据类型占用不同的内存空间,合理定义数据类型可以优化程序的运行。
C++为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型。表2-2为7种C++内置数据类型。
表2-2 C++内置数据类型
☆大牛提醒☆
宽字符型的定义格式为“typedef short int wchar_t;”,因此wchar_t实际上的空间和short int一样。
2.3.1 整型数据类型
C++语言中的整型数据类型按符号划分,可以分为有符号(signed)和无符号(unsigned)两类;按长度划分,可以分为普通整型(int)、短整型(short)和长整型(long)三类,如表2-3所示。
表2-3 整数类型
为了得到某个类型或某个变量的存储大小,用户可以使用sizeof(type)表达式查看对象或类型的存储字节大小。
【实例2.2】编写程序,获取整型数据类型的存储大小、字节数等信息,并在屏幕上输出(源代码\ch02\2.2.txt)。
#include <iostream> //头文件引用 using namespace std; //命名空间 int main() //主函数 { cout << "short: \t\t" << "所占字节数:" << sizeof(short); cout << "\t最大值:" << (numeric_limits<short>::max)(); cout << "\t最小值:" << (numeric_limits<short>::min)() << endl; cout << "int: \t\t" << "所占字节数:" << sizeof(int); cout << "\t最大值:" << (numeric_limits<int>::max)(); cout << "\t最小值:" << (numeric_limits<int>::min)() << endl; cout << "unsigned: \t" << "所占字节数:" << sizeof(unsigned); cout << "\t最大值:" << (numeric_limits<unsigned>::max)(); cout << "\t最小值:" << (numeric_limits<unsigned>::min)() << endl; cout << "long: \t\t" << "所占字节数:" << sizeof(long); cout << "\t最大值:" << (numeric_limits<long>::max)(); cout << "\t最小值:" << (numeric_limits<long>::min)() << endl; cout << "unsigned long: \t" << "所占字节数:" << sizeof(unsigned long); cout << "\t最大值:" << (numeric_limits<unsigned long>::max)(); cout << "\t最小值:" << (numeric_limits<unsigned long>::min)() << endl; }
程序运行结果如图2-6所示。
图2-6 例2.2的程序运行结果
2.3.2 浮点型数据类型
浮点数的小数点位置是不固定的,可以浮动。C++语言中提供了3种不同的浮点型数据类型,包括单精度型、双精度型和长双精度型,如表2-4所示。
表2-4 浮点型数据类型
当精度要求不严格时,例如员工的工资需要保留两位小数,就可以使用float类型;double类型提供了更高的精度,对于绝大多数用户来说已经够用;long double类型支持极高精度,但很少被使用。
【实例2.3】编写程序,输出浮点类型占用的存储空间及其范围值(源代码\ch02\2.3.txt)。
#include <iostream> //头文件引用 using namespace std; //命名空间 int main() //主函数 { cout << "float: \t\t" << "所占字节数:" << sizeof(float); cout << "\t最大值:" << (numeric_limits<float>::max)(); cout << "\t最小值:" << (numeric_limits<float>::min)() << endl; cout << "double: \t" << "所占字节数:" << sizeof(double); cout << "\t最大值:" << (numeric_limits<double>::max)(); cout << "\t最小值:" << (numeric_limits<double>::min)() << endl; cout << "long double: \t" << "所占字节数:" << sizeof(long double); cout << "\t最大值:" << (numeric_limits<long double>::max)(); cout << "\t最小值:" << (numeric_limits<long double>::min)() << endl; }
程序运行结果如图2-7所示。
图2-7 例2.3的程序运行结果
2.3.3 字符型数据类型
在C++语言中,字符型数据类型使用“' '”来表示,如'A'、'5'、'm'、'$'、';'等,其存储方式是按照ASCII编码方式,且每个字符占一个字节,如表2-5所示。
表2-5 字符型数据类型
【实例2.4】编写程序,输出字符型数据类型所占字节数(源代码\ch02\2.4.txt)。
#include <iostream> //头文件引用 using namespace std; //命名空间 int main() //主函数 { cout << "char: \t\t" << "所占字节数:" << sizeof(char)<< endl; cout << "signed char: \t" << "所占字节数:" << sizeof(signed char)<< endl; cout << "unsigned char: \t" << "所占字节数:" << sizeof(unsigned char)<< endl; }
程序运行结果如图2-8所示。
图2-8 例2.4的程序运行结果
字符型数据既可以使用字符形式输出(即采用%c格式控制符),也可以使用整数形式输出。例如:
char c ='A'; printf("%c,%u ",c,c);
以上这段代码的输出结果是:A,65。此处的65是字符'A'的ASCII码。
【实例2.5】编写程序,实现字符和整数的相互转换输出(源代码\ch02\2.5.txt)。
#include <iostream> using namespace std; int main() { char cch='A'; //定义字符变量并赋值 int ich='A'; //定义整型变量并赋值 cout<<"cch="<<cch<<endl; //输出单个字符 cout<<"ich="<<ich<<endl; //输出字符对应的ASCII码 }
程序运行结果如图2-9所示。在本实例中先定义了一个char型变量cch,其后给cch赋值为'A',将字符变量cch输出,再定义一个int型变量ich,给它赋值也是'A',然后将该变量输出。
图2-9 例2.5的程序运行结果
从结果来看,定义了字符型数据cch和整型数据ich,给它们赋值都为字符'A',输出结果却不同,整型变量ich的输出为65。这是因为字符型数据在计算机内部是转换为整型数据来操作的,如上述代码中的字母A,系统会自动将其转换为对应的ASCII码值65。
知识扩展:C++语言中还保留着屏幕输出函数printf(),使用该函数可以将任意数值类型的数据输出到屏幕中。因此将上述实例的代码修改为如下代码,也同样可以实现字符和整数的相互转换输出。代码如下:
#include <iostream> //头文件引用 using namespace std; //命名空间 int main() //主函数 { char cch='A'; /*字符变量cch初始化*/ int ich='A'; /*整型变量ich初始化*/ printf("cch=%c\n",cch); /*以字符型输出cch*/ printf("ich=%u\n",ich); /*输出字符对应的ASCII码*/ }
程序运行结果如图2-10所示。
图2-10 字符和整数的相互转换输出
2.3.4 布尔型数据类型
在逻辑判断中,结果通常只有真和假两个值。C++语言中提供了布尔类型(bool)来描述真和假。布尔类型共有两个取值,分别为true和false,true表示真,false表示假。
在程序中,布尔类型被作为整数类型对待,true表示1,false表示0。将布尔类型赋值给整型是合法的;反之,将整型赋值给布尔类型也是合法的。例如:
【实例2.6】编写程序,定义布尔型数据类型,并输出布尔型数值(源代码\ch02\2.6.txt)。
#include <iostream> using namespace std; int main() { bool bflag=true; //定义布尔型变量并赋值 int iflag=true; //定义整型变量并赋值 cout<<"bflag="<<bflag<<endl; //输出布尔型变量的值 cout<<"iflag="<<iflag<<endl; //输出整型变量的值 }
程序运行结果如图2-11所示。在本实例中先定义了一个bool类型的变量bflag并赋值为true,又定义了一个int型的变量iflag并赋值为true,最后将iflag和bflag输出。
图2-11 例2.6的程序运行结果
☆大牛提醒☆
从运行结果可以看到,布尔型变量bflag和整型变量iflag的输出值并不是true,而都是整数值1,这是使用布尔类型数据时需要注意的。
2.3.5 自定义数据类型
使用typedef可以自定义数据类型,语句由3个部分组成,分别是关键字typedef、类型名称、类型标识符。具体的语法格式如下:
typedef 类型名称 类型标识符;
以上格式中typedef为系统关键字;“类型名称”为已知数据类型名称,包括基本数据类型和用户自定义数据类型;“类型标识符”为新的类型名称。例如:
typedef double LENGTH; typedef unsigned int COUNT;
定义新的类型名称后,可以像基本数据类型那样定义变量。例如:
typedef unsigned int COUNT; unsigned int b; COUNT c;
typedef的主要应用有如下几种形式。
(1)为基本数据类型定义新的类型名。
(2)为自定义数据类型(结构体、公用体和枚举类型)定义简洁的类型名称。
(3)为数组定义简洁的类型名称。
(4)为指针定义简洁的名称。
【实例2.7】编程程序,自定义数据类型,然后输出自定义数据类型所占字节数(源代码\ ch02\2.7.txt)。
#include <iostream> using namespace std; typedef unsigned int UINT; int main() { unsigned int a; a=123; UINT b; b=456; cout<<"a="<<a<<endl; cout<<"sizeof a="<<sizeof(a)<<endl; cout<<"b="<<b<<endl; cout<<"sizeof b="<<sizeof(b)<<endl; }
程序运行结果如图2-12所示。在本实例中,使用type def定义了一个UINT类型,该类型等同于int型。在主程序中,定义了一个int型变量a并赋值为125;定义了一个UNIT型变量b并赋值为456。将a的值和a的存储字节大小输出,将b的值和b的存储字节大小输出。
图2-12 例2.7的程序运行结果
从运行结果来看,a和b属于同一种数据类型(unsigned int型),因为UINT标识符已经定义为unsigned int类型。